Activity生命周期及启动模式深入理解

Activity

简介:
Activity是用户接口程序,原则上它会提供给用户一个交互式的接口功能,它是Android应用程序的基本功能单元,可以通过布局文件赋予一个Activity界面,用于后期的交互,直观讲,就是每个Activity是独立的一个页面(当然有时候也会是对话框形式等)。
Android是通过Activity栈的方式来管理Activity的,一个Activity的实例的状态决定它在栈中的位置,处于前台显示的Activity总会在栈的顶端,当前台的Activity因为异常或者其他原因被意外销毁时,处于栈第二层的Activity将被激活至第一层。当有新的Activity启动入栈,则原先的Activity会被压入第二层,依次变换。

Activity的生命周期:

Activity的生命周期有:
onCreate();onStart();onResume();onPause();onStop();onDestroy();
对于这几个状态有如下解释:
onCreate() : 这里一般是创建界面,做一些初始化的工作;
onStart() : 这一步是启动界面,但是用户可见不可交互;
onResume() : 此时可以交互;
onPause() : 这里是可见但不可以交互,系统会停止动画以及消耗CPU资源的操作,在这里可以做一些简单数据的保存工作,但是不能处理耗时较长的操作;
onStop() : 此时是不可见,被下一个Activity覆盖;
onDestroy() : 这个Activity被销毁前最后调用的一个方法,有可能是其他类调用了finish()方法或者系统回收;

常见情形的调用顺序:
一个Activity正常启动过程中,调用顺序是: onCreate() —> onStart() —> onResume();
当Activity被kill的时候调用顺序是: onPause() —> onStop() —> onDestroy();
对于普通Activity中断,调用顺序是:onPause() —> onStop(),恢复的时候为:onStart() —> onResume();
如果在中断过程中被系统回收,便会有onDestroy()的调用,此时如果有数据需要保存,因为此为非常态退出,可以通过onSaveInstanceSate()的函数保存临时数据,在恢复的时候,会重新调用完整的周期:onCreate(savedInstanceState) —> onStart() —> onResume();
如果此Activity Theme为Dialog或者透明(即不会完全覆盖原始Activity),那么中断只会有onPause(); 恢复便是 onResume()。
此时,再对照上图,所有的知识点便十分清晰。

Activity生命周期示意图:

Activity 启动模式:

Activity有四种启动模式:standard , singleTop , singleTask , singleInstance
可以根据实际的需求为Activity设置对应额启动模式,从而可以避免创建大量重复的Activity等问题。
设置方法是在AndroidManifest.xml中对特定的Activity节点设置其launchMode:

<activity 
android:name=”testActivity” 
android:launchMode=”standard” />

下面对这四种模式分别介绍:
standard模式:
默认模式,可以不用写配置,这个模式下,Intent会发送给新的实例,每次的跳转都会生成新的Activity实例,允许多个相同Activity的叠加;
比如:
有一个Activity名为A1,其中有个按钮可以跳转至A1,那么当我点击按钮,便会启动一个Activity A1覆盖在之前的A1智商,在此点击,类似……
点击返回键会按照栈的顺序依次弹出;

singleTop模式:
也是发送新的实例,但不同于standard的是,在请求的Activity如果正好位于栈顶此时不会创建新的实例,即不允许多个相同Activity叠加;
比如:
有两个相同内容的Activity A,B,A 为standard,B为singleTop,其中都有按钮为跳转至自身的Activity:
当意图跳转顺序为: A->B->B时,实际打开顺序为 A -> B;(因为后一个打开B,实际上是调用了前一个的onNewIntent()方法);
当意图跳转顺序为: A->A->B时,实际打开顺序为 A -> A -> B;
singleTask模式:
只能有一个实例,当intent到达,需要创建新的Activity实例时,首先回去检查栈里面是否已经有该Activity的实例,如果有就直接将其intent发送给它;
比如:
有三个Activity A,B,C,之间可以互相跳转,其中B为singleTask,其他的两个允许有多个实例,如果意图依次跳转顺序是: A -> B -> C -> B -> C -> A -> B,但是实际的跳转顺序应该如下:

操作:A -> B ;              实际:A -> B;

 A -> B -> C ;                  A -> B -> C;

 A -> B -> C -> B;              A -> B;

 A -> B -> C -> B -> C ;        A -> B -> C;

 A -> B -> C -> B -> C -> A;    A -> B -> C -> A;

 A -> B -> C -> B -> C -> A -> B;     A -> B;

singleInstance 模式:
所谓的Task,可以理解为是一个栈,可以放入多个Activity,当启动一个应用,那么便创建了一个Task,并且该task中仅能有一个Activity。那么问题来了,当多个task共享一个Activity呢?
比如:
开启一个地图服务的应用,里面有个用到百度地图的Activity,并且这个Activity是singleInstance启动模式的,当按下home键返回桌面,(前提是这个应用还没有被系统回收),然后再单独启动百度地图,会发现此时百度地图里面的数据还是之前那个应用留下的。
SingleInstance模式就是将该Activity单独放入到一个task栈中,并且这个栈有且仅有一个Activity,不同应用的intent由同一个Activity接收和展示的话,那就做到了数据的共享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值