跳槽季“充电宝”Android面试题(二)

luoyjx · 2015-01-30 21:16 · 1202次阅读

1.请描述下Activity的生命周期

Activity的生命周期方法有:onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestory()。

Activity的三个状态:

1>             运行状态 :当Activity在屏幕前台时(即位于当前任务堆栈的顶部),它是激活或运行状态,这个时候有三种情况:1、当前Activity是第一次被初始化,执行的生命周期方法是:onCreate()、onStart()、onResume();2、当前Activity的是由暂停状态转变而来,执行的生命周期方法是: onResume();3、当前Activity是由停止状态转变而来,执行的生命周期方法是:onRestart()、onStart()、onResume()。

2>             暂停状态 :当Activity上面有另外一个Activity,使它失去了焦点但仍然对用户可见时,它处于暂停状态(即在它之上的Activity并没有完全覆盖屏幕,或者是透明的,被暂停的Activity仍然对用户可见,并且是存活状态,如果系统内存不足时会杀死这个Activity),这个时候执行的生命周期方法:onPause()。

3>             停止状态 :当Activity完全被另一个Activity覆盖时则处于停止状态(它仍然保留所有的状态和成员信息,然而对用户是不可见的,它的窗口将被隐藏,如果其它地方需要内存,系统会杀死这个Activity),这个时候执行的生命周期方法: onPause()、onStop()。

实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环:

Activity 的完整生命周期 :自第一次调用onCreate()开始,直至调用onDestory()为止。

Activity 的可视生命周期 :自onStart()调用开始直到相应的onStop()调用结束。

Activity 的前台生命周期 :自onResume()调用起,到相应的onPause()调用为止。

  1. 你后台的Activity被系统回收怎么办:onSaveInstanceState()

当你的程序中某一个Activity A在运行中,主动或被动地运行另一个Activity B这个时候A会执行onSaveInstanceState()方法缓存一些计算的数据;

    public   void onSaveInstanceState(Bundle outState) {

       super.onSaveInstanceState(outState);

       outState.putInt( “id” , 1);

    }

B完成之后又会来找A,这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被回收的就还是onResume()就好了。

savedInstanceState是一个Bundle对象,可以理解为系统帮你维护的一个Map对象,在onCreate()里你可能会用到它,如果正常启动onCreate()就不会有它,所以用的时候要判断一下是否为空。

    if(savedInstanceState !=null) {

       int id =savedInstanceState.getInt( “id” );

    }

 

3.onSaveInstanceState和onRestoreInstanceState的触发时机

当某个Activity变得“容易”被系统销毁时,该Activity的onSaveInstanceState就会被执行,除非Activity是被用户主动销毁的,例如当用户按Back建的时候。

注意上面:何为“容易”?就是该Activity还没有被销毁,而仅仅是一种可能性。有哪几种情况:

1>            当用户按下Home键时;

2>            长按Home键,选择运行其他的程序时;

3>            从Activity A中启动一个新的Activity时;

4>            按下电源按键(关闭屏幕显示)时

5>            屏幕方向切换时(在屏幕切换之前,系统会销毁Activity A,在屏幕切换之后系统又会自动地创建Activity A,所以onSaveInstanceState一定会执行)

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的Activity,则onSaveInstanceState会被系统调用(当然你不保存那就随便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,Activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示Activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到Activity A,这种情况下Activity A一般不会因为内存的原因被系统销毁,故Activity A的onRestoreInstanceState不会被执行。

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

4.什么是ANR如何避免它?

ANR : Application Not Responding 。

在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所监视,当用户触发输入事件(如按键、触摸屏事件)的响应超过5秒,或者广播接收者(BroadcastReceiver)的onReceiver()方法在10秒没有执行完毕,那么Android会认为该应用无响应,便弹出ANR对话框。

避免方法:Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作、潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者异步方式)来完成,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程;如果BroadcastReceiver要完成比较耗时的操作,应该通过发送Intent给Service,有Service来完成(注意广播接收者不能用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了;一旦BroadcastReceiver结束,它所在的进程(此时已变成空进程)很容易在系统需要内存时被优先杀死,那么正在工作的子线程也会被杀死)。

5.什么情况下会导致Force Close?如何避免?能否捕捉异常?

程序出现异常,比如nullpointer会导致Force Close。

避免:编写程序时逻辑连贯,思维缜密。

能捕获异常,在logcat中能看到异常信息。

6.Activity在屏幕旋转时的生命周期

在默认情况下,当“屏幕方向”或“键盘显示隐藏”变化时都会销毁当前Activity,创建新的Activity。如果不希望新创建Activity实例(不执行各个生命周期),可以AndroidManifest文件的Activity中配置:(android:configChanges =”keyboardHidden|orientation”);这里android:configChanges属性指定了要捕获“屏幕方向”和“键盘显示隐藏”变化,当捕获到这些变化后会调用Activity的onConfiguratinoChanged()方法。

当没有配置android:configChanges属性:竖屏切横屏会执行一次生命周期;横屏切竖屏会执行两次生命周期;如果只希望执行一次生命周期,可以配置android:configChanges=”orientation”。

原文 http://blog.csdn.net/waxx716/article/details/8792014

收藏

暂无评论

登录后可以进行评论。没有账号?马上注册