Android-Activity
<intent-filter>
<action Android:name = "Android.intent.action.MAIN" />
<category Android:name = "Android.intent.category.LAUNCHER" />
</intent-filter>
<action Android:name = "Android.intent.action.MAIN" /> 表示该 Activity 作为主 Activity 出现。<category Android:name = "Android.intent.category.LAUNCHER" /> 表示该 Activity 会被显示在最上层的启动列表中。
返回栈
- Android中的活动是可以层叠的,我们每启动一个新的活动,就会覆盖在原活动之上,然后点击Back键会销毁最上面的活动,下面的一个活动会重新显示出来。Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈。
- 栈是一种后进先出的数据结构,在默认情况下,每当我们创建一个新的活动,它会在返回栈中入栈,并处于栈顶位置。每当我们按下Back键或调用finish方法销毁一个活动时,处于栈顶的活动就会出栈,这是前一个入栈的活动就会重新处于栈顶的位置,系统总会显示处于栈顶的活动给用户
活动的生命周期
生命周期 | 说明 |
---|
onCreate() | 首次创建 Activity 时调用。您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。始终后接onStart() | onStart() | 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见罢了。onStart()之后如果Activity转入前台,则后接 onResume() 如果 Activity 转入隐藏状态,则后接 onStop()。 | onResume() | 当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。始终后接onPause() | onPause | 当前 Activity正在停止(Paused形态),系统即将开始继续另一个Activity时会调用此方法。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。 如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。 | onStop() | 在 Activity 对用户不再可见时调用。如果 Activity 被销毁或另一个Activity 继续执行并将其覆盖,就可能发生这种情况。如果Activity恢复与用户的交互,则后接onRestart(),如果Activity被销毁则后接onDestroy() | onDestory() | 在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 | onRestart() | 在 Activity 已停止并即将再次启动前调用。 |
这些方法共同定义 Activity 的整个生命周期。您可以通过实现这些方法监控 Activity 生命周期中的三个嵌套循环:
生存期 | 说明 |
---|
完整的生命周期 | Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。 | 可见生存期 | Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。 | 前台生存周期 | Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。 |
如果 Activity 离开可见阶段,长时间失去焦点,就很可能被系统销毁以释放资源。当然,即使该 Activity 被销毁掉,用户对该 Activity 所做的更改也会被保存在 Bundle 对象中,当用户需要重新显示该 Activity 时,Android 系统会根据之前保存的用户更改信息将该 Activity 重建。
Activity的四种启动模式
Activity的affinity:
- affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中
- Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定
- 在默认情况下,所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性
- Application默认的affinity属性为Manifest的包名。
- 不过,你可以修改 activity 默认的 affinity 值。不同应用中的 activity 可以共享同一个 affinity 值,同一个应用中的 activity 也可以赋予不同的 task affinity 值。你可以用元素的taskAffinity 属性修改 activity 的 affinity
启动模式 | 说明 |
---|
默认启动模式——standard | Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中 | 栈顶复用模式——singleTop | 在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。 | 栈内复用模式——singleTask | 与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,将task内的对应Activity实例之上的所有Activity弹出栈, 将对应Activity置于栈顶,获得焦点。 | 全局唯一模式——singleInstance | 在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态) |
上述所有情况,在Mainfest中通过launchMode属性设置,被称为静态设置,动态设置Activity启动方式(如果同时有动态和静态设置,那么动态的优先级更高)。
动态设置是通过设置要启动的Activity的启动模式:
intent.setFlags(...);
几个常见的Flag:
Intent.FLAG_ACTIVITY_NEW_TASK
与singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配,如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。
Intent.FLAG_ACTIVITY_SINGLE_TOP
与静态设置中的singleTop效果相同
Intent.FLAG_ACTIVITY_CLEAR_TOP
与singleTask相似当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:
- 如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
- 没有设置,则将栈内的对应Activity销毁重新创建。
|