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接收和展示的话,那就做到了数据的共享。