1 简介

本篇将从Activity的入门开始,细节化的阐述Activity相关的知识点。

2 Activitiy生命周期

activity 退回到发起人 vue及java代码 activity返回键的流程_activity启动模式


该流程图来源于安卓官网,该图对activity的生命周期做了简单的阐述。以下将针对生命周期中各种流程的走向做个说明。

2.1完整生命周期

onCreate->onStart->onResume->onPause->onStop->onDestroy

以下几种场景会走完整的生命周期:

  • 用户打开APP,然后back键退出APP,首页的Activity会走完完整的生命周期
  • A activity中跳转到B activity,点击back键返回A activity,B activity会执行完整生命周期
  • 长按Home键或者使用菜单键,弹出多任务栏,杀死APP,当前显示的Activity会执行完整生命周期

2.2 前台生命周期

onResume->onPause

前台生命周期范围内,该Activity可见,且在onResume和onPause中间可以相应用户的的交互。
常见的几种场景如下:

  • 弹出透明的Activity,原有Activity会执行该生命周期
  • 弹出提示框
  • 其他覆盖Activity,但Activity依旧可见

2.3 可见生命周期

onStart->onResume->onPause->onStop

在前台生命周期内Activity是可见的,且可以相应用户的交互。可见生命周期内界面可见,onPause方法执行以后不再相应用户交互,onStop方法执行以后,界面不可见。
常见的几种场景如下:

  • A activity 跳转到B activity时,A activity会执行该生命周期
  • 当设置首页Activity后台运行时,点击back关闭当前应用时,首页的Activity会执行该生命周期
public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(false);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
  • 手机自动进入休眠状态时,当前Activity会执行该生命周期

3 Activity各个周期方法

3.1 onCreate

该方法执行时,Activity还不可见。

  • 方法的参数介绍
public void onCreate(Bundle saveInsanceState)

该参数有什么用途,什么场景下会用到呢?
从字面意义,即可看出该参数是用于保存状态的。该参数主要是由
onSaveInsanceState(Bundle saveInsanceState)生成,Activity在被销毁时,都会调用该方法,我们可以利用这个特点,在此做一些状态的保存,如游戏进度保存,当前阅读位置保存等。

  • 这里可以做什么事情
    该方法作为Activity启动的第一步,可以做以下事情:
  • 加载视图,对于复杂的视图可以考虑动态加载,不要一次性加载完毕
  • 做一些不耗时的初始化操作

3.2 onStart

该方法执行时,Activity是可见状态,但并不是用户可见。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。

3.3 onResume

此时Activity经过前两个阶段的初始化已经完成,Activity在这个阶段已经出现在前台并且可见了。该方法执行以后,Activity即可相应用户的交互。

3.4 onPause

该方法执行以后Activity处于停止状态,但是用户依旧可以看到该Activity。
因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。

3.5 onStop

stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。

3.6 onDestroy

destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。

4 启动模式

Activity一共有四种启动模式:

  • standard
标准启动模式,也是activity的默认启动模式。在这种模式下启动的activity可以被多次实例化,即在同一个任务中可以存在多个activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,即调用startActivity(new Intent(this,A.class)),会在A的上面再次启动一个A的实例,即当前的桟中的状态为A-->A。
  • singleTop
如果一个以singleTop模式启动的activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。举例来说,如果A的启动模式为singleTop,并且A的一个实例已经存在于栈顶中,那么再调用startActivity(new Intent(this,A.class))启动A时,不会再次创建A的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()方法。这是任务桟中还是这有一个A的实例。
   如果以singleTop模式启动的activity的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard模式相同,也会创建多个实例。
  • singleTask
这种模式与 standard 和 singleTop 截然不同。拥有 singleTask 启动模式的 Activity 在系统中只允许存在一个实例(有点像单例)。如果系统中已经有一个 Activity 实例的话,拥有该实例的 Task 将被移到顶部,并且 Intent 将通过 onNewIntent() 方法传递过来。如果没有,新的 Activity 将被创建并放在对应的 Task 中。以下分两种情况进行阐述:
   1.同一个应用
   如果系统中还没有 singleTask Activity 实例的话,创建一个新的 Activity 并放置在相同 Task 里面。
   但是如果已经有一个的话,这个 singleTask Activity 上面的所有Activities 都会按照适当的生命周期方式自动销毁,来使得我们想要的 Activity 出现在栈顶。同时,这个 singleTask Activity 通过 onNewIntent() 方法接受被发送的 Intent 对象。
   2.不同的应用
     如果系统中还没有 singleTask Activity 实例的话,新的 Task 将被创建,并且新创建的 Activity 被作为根 Activity 放置。
     如果已经存在一个 singleTask Activity 拥有者 Task 并且 Activity 还没有被创建的话,新创建的 Activity 将被置于栈顶。
     如果一个 singleTask Activity 实例已经在某个 Task 中存在,整个 Task 将会出现在顶部并且位于该 singleTask Activity 上面的所有 Activity 会以适当的生命周期流程销毁掉。如果使用返回按钮,用户不得不先经历当前 Task 所有 Activities 然后返回至调用者 Task。
  • singleInstance
这种模式很接近 singleTask,只允许系统中存在一个 Activity 实例。不同之处在于拥有这个 Activity 的 Task 只能包含一个 Activity 实例,也就是这个 singleInstance 模式的 Activity。如果使用这种模式的 Activity 打开另一个 Activity,系统将自动创建一个新的 Task 来容纳新的 Activity。同样的,如果 singleInstance Activity 被调用,新的 Task 将被创建来存放这个 Activity。