Activity

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:

  1. affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中
  2. Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定
  3. 在默认情况下,所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性
  4. Application默认的affinity属性为Manifest的包名。
  5. 不过,你可以修改 activity 默认的 affinity 值。不同应用中的 activity 可以共享同一个 affinity 值,同一个应用中的 activity 也可以赋予不同的 task affinity 值。你可以用元素的taskAffinity 属性修改 activity 的 affinity
启动模式说明
默认启动模式——standardActivity的默认模式就是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:

  • 1、NEW_TASK

Intent.FLAG_ACTIVITY_NEW_TASK

与singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配,如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。

  • 2、SINGLE_TOP

Intent.FLAG_ACTIVITY_SINGLE_TOP

与静态设置中的singleTop效果相同

  • 2.3.CLEAR_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

与singleTask相似当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:

  1. 如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
  2. 没有设置,则将栈内的对应Activity销毁重新创建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值