1.1 activity的生命周期全解析

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");
}

推荐阅读更多精彩内容

  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    安卓Boy阅读 1,383评论 3 5
  • 您的应用中的Activity应该做到如下需求: 1.用户在使用应用时接听来电或切换到另一个应用,它不会崩溃。 2....
    正阳Android阅读 371评论 1 0
  • 大概快一年没有上简书了,很惊喜的发现居然有两位“没有留下痕迹的读者”分别打赏了两块钱,心里真的万分感动,趁着还有余...
    stefanli阅读 5,875评论 0 14
  • 时间用途: 1.学习工作技巧 2.见客户,增员(主顾开拓算在里面) 3.读书 其他的事情都视为浪费时间
    ODY奥德赛布道者阅读 110评论 0 1
  • 顾城的《避免》里有这样一句话:你不愿意种花,你说,我不愿意看见它,一点点凋落,是的,为了避免结束,你避免了一切...
    YZY_1989阅读 425评论 0 1
  • 昨天给忘记了,我再想想
    猫宁呀阅读 82评论 0 0