Activity的生命周期

2019-02-15  本文已影响0人  在一颗大大大榕树下
  1. Activity是什么?

    是APP与用户交互的接口

  2. Activity的生命周期
activity的生命周期

场景:

当用户点击A中按钮来到B时,假设B全部遮挡住了A(非透明)
A:onPause > B: onCreate > onStart > onResume > A:onStop
A的onPause方法和onStop中不要做耗时操作,不然会影响B的启动

此时如果点击Back键,将依次执行:
B:onPause > onStop > onDestroy > A:onRestart > onResume

此时如果按下Back键,系统返回到桌面,并依次执行:
A:onPause > onStop > onDestroy

当用户点击A中按钮来到B时,假设B全部遮挡住了A(透明)
A:onPause > B: onCreate > onStart > onResume

此时如果点击Back键,将依次执行:
B:onPause > onStop > onDestroy > A:onResume

  1. 异常状态下的生命周期

异常关闭:异常关闭一般有几种情况,常见的比如锁屏,home键,电话,任务管理键,使得Activity进入onStop状态,此时Activity可能因为内存不足而被杀死(异常关闭)

异常关闭时触发onSaveInstanceState方法保存数据

activity重新启动时,通过onRestoreInstanceState或者onCreate中的Bundle参数恢复数据

这两者之间的区别在于:
onRestoreInstanceState方法是在onReStart时调用的,并且会自行判断需不需要恢复数据
onCreate方法中通过Bundle参数恢复数据需注意,由于无法判断需不需要恢复数据,在activity第一次启动时,Bundle是空值,所以需要添加非空判断

   @Override                                                            
   protected void onRestoreInstanceState(Bundle savedInstanceState) {   
       super.onRestoreInstanceState(savedInstanceState);                
                                                                 
   }  
  @Override
  protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
   
  }

系统设置改变:如屏幕旋转、键盘、语言等等,会触发Activity重新创建。若想要这些改变时,不触发Activity重启,可以通过在AndroidManifest里设置activity的configChanges属性。常用的有locale(语言区域)、orientation(屏幕方向)、keyboardHidden(键盘无障碍功能)、screenSize(当前可用屏幕尺寸发生了变化,旋转屏幕尺寸会触发)。

    android:configChanges="orientation|keyboardHidden|screenSize"

配置后不会销毁activity,并调用onConfigurationChanged方法

  1. 不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
00:50:22.432 3098-3098/com.yirong.androidpractice I/MainActivity: onPause
00:50:22.433 3098-3098/com.yirong.androidpractice I/MainActivity: onSaveInstance
00:50:22.433 3098-3098/com.yirong.androidpractice I/MainActivity: onStop
00:50:22.433 3098-3098/com.yirong.androidpractice I/MainActivity: onDestroy
00:50:22.464 3098-3098/com.yirong.androidpractice I/MainActivity: onCreate
00:50:22.468 3098-3098/com.yirong.androidpractice I/MainActivity: onStart
00:50:22.468 3098-3098/com.yirong.androidpractice I/MainActivity: onRestoreInstanceStateworld
00:50:22.468 3098-3098/com.yirong.androidpractice I/MainActivity: onResume
  1. 设置configChanges="orientation|keyboardHidden|screenSize"后,切屏不会销毁Activity,并调用onConfigurationChanged方法

11:00:47.249 1103-1103/? I/MainActivity: onCreate
11:00:47.259 1103-1103/? I/MainActivity: onStart
11:00:47.279 1103-1103/? I/MainActivity: onResume
11:02:19.729 1103-1103/com.yirong.androidpractice I/MainActivity: onConfigurationChanged:横屏
11:02:29.889 1103-1103/com.yirong.androidpractice I/MainActivity: onConfigurationChanged:竖屏
  1. 启动模式
  1. 默认的模式
  2. 每启动一个Activity都会创建一个新的实例
  3. 启动流程OnCreate->onStart->Resume
  1. 根据当前Activity的TaskAffinity属性,去寻找属性对应名字的任务栈
  2. 如果目标任务栈不存在,就创建一个新的task
  3. 如果目标任务栈存在,则判断当前task中有无Activity的实例:若无,则创建一个新的Activity;若存在,则将该实例置于栈顶,并将此实例上的所有Activity全部销毁
  1. 如果当前Activity实例不在栈顶,那么创建一个新的Activity实例
  1. 此模式启动的Activity具有全局唯一性
  2. 独自占有一个任务栈
上一篇 下一篇

猜你喜欢

热点阅读