1. 生命周期(共7个)
- 1.onCreate:表示activity的创建,我们可以做初始化数据工作。
- 2.onStart:表示activity的可见,但我们还看不到。
- 3.onResume:表示activity出现在前台,我们可以看到。
- 4.onPause:表示activity正在停止工作,紧接着会执行onStop。这里不可以执行耗时操作。因为当前activity的onPause执行完,下一个activity的onResume才会执行。
- 5.onStop:表示activity的停止工作。可以执行一些耗时操作。
- 6.onDestory:表示activity的销毁,我们可以做一些资源回收和释放工作。
- 7.onRestart:表示activity正在重新启动。出现的时机是activity的onPause和onStop执行了,接着用户又回到这个activity时。
2. 针对一个特定的Activity
- 第一次启动:onCreate->onStart->onResume
- 再次回到原Activity:onRestart->onStart->onResume
- 用户按back键:onPaume->onStop->onDestroy
3. 特殊情况,当下一个activity采用了透明主题
那么当前Activity不会回调onStop。也就是依旧可见,但不在前台。因为下一个透明,可能还会看到当前的activity。
4. onStart和OnResume,onStop和onPause的不同?
onStart和onStop表示是否可见;onResume和onPause表示是否在前台。而且这两块多是连续操作,实际使用没有明显区别。注意onPause不能耗时,如果下一个Activity是透明主题,则当前Activity的onStop不会执行。
5. 当前activity的onPause和下一个activity的onResume哪个会先执行?
用脚趾头想想,如果下一个Activity的onResume先执行,则会出现两个activity在前台并获得焦点,这是不可能的。所以当前Activity的onPause先执行,所以onPause中不要进行耗时操作。
6. activity的启动过程简述
启动Activity的请求会由instrumentation来处理,然后它通过Binder向AMS(ActivityManagerService)发请求,AMS内部维护着一个ActivityStack并负责栈内Activity的状态同步,AMS通过ActivityThread去同步Activity的状态而完成Activity生命周期方法的调用。
7. 系统资源加载机制简述
比如图片资源,当我们把图片放到drawable中时,我们可以通过Resources去获取。同时为了兼容不同设备,我们可能还需要在其他目录放置不同的图片,比如drawable-hdpi,drawable-xhdpi等。这样,当应用程序启动时,系统就会根据当前设备的情况去加载合适的Resources资源,同理横竖屏也可能会加载不同图片(drawable-hdpi-port和drawable-hdpi-land)。此时如果旋转屏幕,由于系统配置发生了改变,默认情况下,Activity就会被销毁和重建。
8. 默认情况下Activity的销毁和重建生命周期
- 销毁:onSaveInstanceState->onStop->onDestory
- 重建:onCreate->onStart->onRestoreInstanceState
onSaveInstanceState方法和onRestoreInstanceState方法和onPause,onResume方法无时间先后,和onStop,onStart方法是有时间先后的。他们存在的意义是当Activity异常终止时,保存和恢复一些数据。
9. activity和view在异常终止时的默认操作
当Activity被异常终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托window去保存数据,window再委托顶级容器去保存数据。顶层容器是一个ViewGroup,一般是DecorView(decor-装饰器)。最后顶层容器再去一一通知它的子View来保存数据。View也有onSaveInstanceState和onRestoreInstanceState方法,会保存一些view本身的数据。如textView会保存当前文本以及选中状态;listview会保存滚动位置等。
10. Activity中的onSaveInstanceState和onRestoreInstanceState的正确使用方式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
if (savedInstanceState != null) {
String test = (String) savedInstanceState.get("test");
Log.e("aaa","onCreate:"+test);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String test = "------------";
Log.e("aaa","onSaveInstanceState:"+test);
outState.putString("test",test);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String test = (String) savedInstanceState.get("test");
Log.e("aaa","onRestoreInstanceState:"+test);
}
打印的Log如下:
06-14 10:45:56.469 21070-21070/qingfengmy.behaviordemo.free E/aaa: onPause
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onSaveInstanceState:------------
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onStop
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onDestroy
06-14 10:45:56.556 21070-21070/qingfengmy.behaviordemo.free E/aaa: onCreate:------------
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onStart
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onRestoreInstanceState:------------
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onResume
恢复数据时,其位置可以在onCreate或onRestoreInstanceState中,二者的区别是:onRestoreInstanceState一旦被调用,其参数saveInstanceState一定是有值的,不用判空。onCreate需要判空。官方建议用onRestoreInstanceState,实际开发中因为onCreate中会做初始化数据,此时再执行onRestoreInstanceState有时会造成重复。在onCreate中做空和不空的处理挺好。
11. Activity的优先级
- 1.前台Activity---正在和用户交互的Activity,优先级最高。
- 2.可见但非前台Activity---如Activity弹了一个dialog,dialog获得焦点,Activity可见但非前台。执行了onPause.
- 3.后台Activity---执行了onStop的Activity
优先级从1到3,逐渐降低。系统内存不足时会从3到1去杀进程。
12. 旋转屏幕Activity不重建的方法
<activity
android:name=".TestActivity"
android:configChanges="orientation|keyboardHidden">
</activity>
configChanges可以有许多值,比如orientation-屏幕方向发生改变;keyboardHidden-屏幕访问性发生改变,如弹出键盘;screenSize-屏幕尺寸发生改变(API13添加的)等。
Activity配置configChanges后,上面配置的信息发生改变时,Activity不会重建,会执行onConfigurationChanged方法。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e("aaa","onConfigurationChanged");
}