Android四大组件之Activity

Activity是啥?

简单来讲就是用来和用户交互的界面,由各个控件组成 ,将内容界面化展示于用户面前,接收用户的触摸事件和用户进行交互,能够说是使用最频繁的组件了。java

Activity生命周期

生命周期: onCreate -> onStart -> onResume ->onPause -> onStop-> onDestroy 以及 onRestart 方法android

Activity生命周期图

一个Activity从建立到销毁的生命周期流程以下:数据结构

开启一个界面app

2019-01-26 15:36:04.134 30064-30064/com.sjc.myapplication I/生命周期-----MainActivity: onCreate: 
2019-01-26 15:36:04.207 30064-30064/com.sjc.myapplication I/生命周期-----MainActivity: onStart: 
2019-01-26 15:36:04.221 30064-30064/com.sjc.myapplication I/生命周期-----MainActivity: onResume: 
复制代码

按下返回键ide

2019-01-26 15:36:12.381 30064-30064/com.sjc.myapplication I/生命周期-----MainActivity: onPause: 
2019-01-26 15:36:12.943 30064-30064/com.sjc.myapplication I/生命周期-----MainActivity: onStop: 
2019-01-26 15:36:12.944 30064-30064/com.sjc.myapplication I/生命周期-----MainActivity: onDestroy: 
复制代码
  1. onCreate 界面被建立,咱们通常在这里进行一些视图和数据以及响应事件的初始化工做。(initView(),initData(),initAction())
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);
        initView();
        initData();
        initAction();
    }
    private void initView(){};
    private void initData(){};
    private void initAction(){};
复制代码
  1. onStart 界面可见,此时界面还不可交互
  2. onResume 界面能够进行交互,好比触发一些点击事件。
  3. onPause 界面失去交互,此时不能够进行交互。常见的致使该生命周期的执行的行为多是:用户按下Home键、按下back键、跳转到下一个页面、弹出一个Dialog,或者PopupWindow等。此时咱们能够作一些存储数据和中止动画等,可是不能太耗时,不然会影响下个页面的跳转(页面与页面以前跳转,先执行当前页面的onPause方法,而后执行下一个页面的 生命周期,具体执行下面有说明)。
  4. onStop 界面彻底不可见的时候调用。两个Activity跳转,前一个Activity的onStop执行是在第二个Activity彻底可见并能够进行交互后执行的(onCreate,onStart,onResume)
  5. onDestroy 界面被销毁,通常咱们在这里作一些资源释放的操做,好比注销广播,关闭弹窗(若是页面被销毁,弹窗未被关闭,则会形成窗体泄漏),关闭动画等。
  6. onRestart 界面从新可见,从一个页面返回上一个页面,首先会调用上一个页面的 onRestart 方法,其次调用上一个页面的 onStart、onResume方法
两个页面进行跳转,ActivityA --> ActivityB 再从ActivityB按下返回键返回到ActivityA,其调用的生命周期方法为:
  • 首先启动 ActivityA:
2019-02-18 23:08:28.362 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onCreate: 
2019-02-18 23:08:28.388 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onStart: 
2019-02-18 23:08:28.390 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onResume: 
复制代码
  • 在 ActivityA 中启动 ActivityB
2019-02-18 23:08:33.347 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onPause: 
2019-02-18 23:08:33.371 4980-4980/com.sjc.myapplication I/生命周期-----ActivityB: onCreate: 
2019-02-18 23:08:33.393 4980-4980/com.sjc.myapplication I/生命周期-----ActivityB: onStart: 
2019-02-18 23:08:33.395 4980-4980/com.sjc.myapplication I/生命周期-----ActivityB: onResume: 
2019-02-18 23:08:33.819 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onStop: 
复制代码
  • 在 ActivityB 中按下返回键
2019-02-18 23:10:59.457 4980-4980/com.sjc.myapplication I/生命周期-----ActivityB: onPause: 
2019-02-18 23:10:59.482 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onRestart: 
2019-02-18 23:10:59.482 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onStart: 
2019-02-18 23:10:59.483 4980-4980/com.sjc.myapplication I/生命周期-----ActivityA: onResume: 
2019-02-18 23:10:59.813 4980-4980/com.sjc.myapplication I/生命周期-----ActivityB: onStop: 
2019-02-18 23:10:59.814 4980-4980/com.sjc.myapplication I/生命周期-----ActivityB: onDestroy: 
复制代码

Activity销毁时保存数据

Activity 异常销毁的时候,会调用 ==onSaveInstanceState== 方法保存数据,该方法是在 onStop 以前执行,咱们可使用 Bundle 来储存数据,当 Activity 重建的时候会调用 ==onRestoreInstanceState== 方法,咱们能够经过 onRestoreInstanceState(Bundle savedInstanceState)传递过来的Bundle来获取以前储存的数据。进行数据恢复。固然也能够在onCreate(Bundle savedInstanceState)方法里面取出来。动画

另:onSaveInstanceState 和 onRestoreInstanceState 方法中,系统自动为咱们作了一些操做: 例如:Edittext 自动还原填写内容, ListView 还原滚动位置,由于每个View都有本身的 onSaveInstanceState 和 onRestoreInstanceState 方法。spa

activity异常销毁的场景:操作系统

  • 1.屏幕旋转会致使Activity重建(能够经过设置 android : configChanges = "orientation" 来防止Activity重建,还能够经过设置 android:screenOrientation="portrait" 锁定Activity方向)
  • 2.内存吃紧,致使优先级低的Activity被回收掉。

Activity 的四种状态:

  1. running:处于前台,和用户进行直接的交互。(系统最不肯意回收)
  2. Paused: 仍然可见,可是不能够交互。(系统不肯意回收)
  3. Stoped: 不可见,处于后台。(内存吃紧的时候,有可能会被回收)
  4. Killed: 被杀死,已经从Activity栈中移除。(系统倾向于回收这种 Activity)

Activity四种启动模式:

经过在 mainfest 里面的 android:launchMode= ""属性来设置
复制代码
  • standard 标准模式,若是不设置启动模式,Android 系统会默认将启动模式设置为该属性。每启动一次 Activity 就会==建立一个实例==压入栈中(连续启动两个同样的 Activity ,会建立两个实例,按照前后顺序压入栈中)。
  • singleTop 在建立实例的时候,首先会查找任务栈==栈顶==是否有该 Activity 的实例存在,若是有就再也不建立新的实例,直接使用栈中的实例。此时不会走 Activity 的 onCreate、onStart 生命周期方法,直接走 onPause--> onNewIntent --> onResume 方法。
  • singleTask 在建立实例的时候,首先查找任务栈==栈中==是否有该实例的存在,若是有就不从新建立,直接将该实例的上面的全部实例(Activity)移除(Finish),也是不会走 Activity 的 onCreate、onStart 生命周期方法,直接走 onPause--> onNewIntent --> onResume 方法。
  • singleInstance 直接为该Activity在整个Android系统中建立一个==单独的任务栈==(若是已经建立过,就再也不从新建立),第一次建立时会走正常的生命周期流程,第二次直接走 onPause--> onNewIntent --> onResume 方法。

关于 taskAffinity 属性(能够指定Activity所在的任务栈),在 launchMode 为 standard 和 singleTop 的时候是没有做用的。具体做用体如今 singleTask 属性上。 具体详情连接 完全弄懂Activity四大启动模式.net

Activity任务栈:

  1. 栈是一个经常使用的数据结构,栈的特色是先进后出,队列是先进先出
  2. Activity 是采用栈的数据结构进行管理的,最早打开的 Activity 最后退出。
  3. 打开一个应用的时候系统会默认分配一个任务栈,当全部 Activity 都退出时,栈就清空了。
  4. 在 Android 操做系统中是有多个任务栈的,通常一个应用对应一个任务栈。
  5. 默认状况下,关闭一个应用,就清空这个这个应用的任务栈,可是这个应用的进程还在。
参考文章:
  1. Android 四大组件
  2. 完全弄懂Activity四大启动模式
相关文章
相关标签/搜索