1.1 activity的生命周期全解析

2016-06-14  本文已影响1567人  武安长空

1. 生命周期(共7个)

2. 针对一个特定的Activity

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的销毁和重建生命周期

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的优先级

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");
}
上一篇 下一篇

猜你喜欢

热点阅读