官方解释:android
The Activity class is a crucial component of an Android app, and the way activities are launched and put together is a fundamental part of the platform’s application model. Unlike programming paradigms in which apps are launched with amain()method, the Android system initiates code in an Activity instance by invoking specific callback methods that correspond to specific stages of its lifecycle.
Activity是Android应用的重要组成部分,它的启动和组合方式是Android应用程序模型的一个基本部分。与使用 main ()方法启动应用程序的编程范例不一样,Android 系统经过调用与其生命周期的特定阶段相对应的特定回调方法来启动 Activity 实例中的代码。
咱们在平常的开发中接触最多的可能就是Activity了,对于Activity个人理解是它做为Android四大组件之一,主要是给咱们提供界面的展现和用户交互。。这里要说下Android的四大组件,Activity、Service、Brocast、ContentProvider功能各不相同可是称它们为四大组件主要是它们四个都是Android应用的入口。咱们都知道Java是采用main ()方法启动应用程序的,可是Android并无采用这种方式,Android设计了四个组件以这些组件为入口来启动一个Android应用。面试
生命周期做为Activity老生常谈的知识点是咱们必需要熟练掌握的。这里要分两种状况去理解掌握:正常状况下的生命周期和异常状况下的生命周期。编程
这能够说是Activity最基本的知识点了在此就不展开了,贴张图
api
再次补充一个关于生命周期的问题就是处于哪些生命周期时是能够被杀死的。
onCreate、onStart()、onRestart()、onResume()当Activity处于这些生命周期时是不可被kill的。onPause()在Honeycomb(3.X版本)以前是能够被kill的,而从Honeycomb开始系统在Activity回调onStop()
以前是不会杀死Activity的,由于这样能够确保在异常状况下onsaveinstancestate被调用,保存状态。
(Android P开始onsaveinstancestate在onStop()以后被调用)app
咱们主要注意如下两种状况下的生命周期:ide
好比常见的如屏幕方向发生变化,配置发生变化是会致使Activity销毁重建的,若是咱们想保持以前的Activity不被销毁那么咱们能够在manifest中设置对应的配置信息 ,以后当其变化时会触发onConfigurationChanged回调此时是不会销毁重建的。可是要注意的是触发回调时当前组件(Activity)必须还在运行 若是组件被暂停 那么是不会触发回调的 。函数
由于Android整体资源有限当内存紧张时系统会根据必定的优先级杀死一些Activity。这里的优先级依次是:前台Activity>可见Activity>后台Activity>空进程。设计
除此以外咱们还要了解onsaveinstancestate/onrestoreinstancestate回调。
onsaveinstancestate是Activity由于异常被系统kill时用来保存当前Activity的有关状态和数据的,咱们也能够在该回调中保存咱们想要保存的数据以防止Activity由于异常被杀死而丢失数据。以后系统会在合适的时机重建该Activity此时就会触发onrestoreinstancestate回调,在该回调里咱们能够拿到以前保存的状态和数据进行恢复(在oncreate中也能够拿到保存的数据不过须要进行判空,因此仍是推荐在onrestoreinstancestate进行恢复)。rest
最后关于这两个函数的回调时机,系统版本不一样会有一些差别:
一、 api < 11,onSaveInstance在onPause以前执行
二、11 <= api < 28,onSaveInstance在onPause以后,onStop以前执行
三、api >= 28,onSaveInstance在onStop以后执行code
指明ComponentName有明确的启动目标
未指明ComponentName,经过匹配intentfilter找到能够启动的目标
经过startActivity
startActivityForResult启动并在onActivityResult中接收返回的结果。
Task是用户在执行某项任务时与之交互的Activity的集合。按照每一个Activity打开的顺序排列在一个堆栈(先进后出)。通常来讲处在栈顶的Activity是正在前台的Activity。
总结Activity和Task的默认行为:
通常而言咱们不须要干预Task的默认行为,可是咱们也能够经过如下方法去干预:
Affinity表示Activity但愿属于哪一个Task。 默认状况下,来自同一个应用程序的全部Activity彼此都有相同的Affinity。能够设置Taskaffinity 属性来自定义Affinity。task自身的affinity决定于根Activity的affinity值也就是说同一个task中的全部Activity具备相同的affinity。
affinity在什么场合应用呢?
1.根据affinity从新为Activity选择宿主task(与allowTaskReparenting属性配合工做);
2.启动一个Activity过程当中Intent使用了FLAG_ACTIVITY_NEW_TASK标记,根据affinity查找或建立一个新的具备对应affinity的task
Affinity还有两点要注意:
一、根activity的taskAffinity能够决定task的“名字”,activity在启动时和re-parent时须要根据taskAffinity来肯定该activity会出如今哪一个task
二、优先级是activity中指定的taskAffinity>application中指定的taskAffinity>默认的包名
Android提供了四种启动模式:
singleInstance
能够看作是singleTask的增强版,改启动模式下每次都会启动一个新的Task并将activity实例放到Task 而且Task中只有这一个activity实例。应用场景 呼叫来电。
android:allowTaskReparenting
这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“true”表示能够移动,“false”表示它必须呆在当前应用的task中,默认值为false 从新宿主的操做发生在应用退后台再次重启过程当中
android:alwaysRetainTaskState
若是用户长时间离开Task,系统将清除除根Activity之外的全部Activity。 当用户再次返回Task时,只恢复根Activity。可是设置该属性为true后就不会发生清除,即便在很长一段时间以后,任务仍然保留其堆栈中的全部活动。
android:clearTaskOnLaunch
在Task的根Activity中,只要用户离开Task并返回到该Task,堆栈就会被清除到根Activity。用户老是返回到Task的初始状态,即便离开Task只有一下子。
android: finishOnTaskLaunch
它做用于一个单一的Activity,而不是一个完整的Task。 它会致使任何Activity消失,包括根Activity。用户离开,而后返回到Task,则该Task再也不存在。
FLAG_ACTIVITY_NEW_TASK
其效果与指定Activity为singleTask模式一致。系统会寻找或建立一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,若是找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,若是查找无果,则建立一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task
FLAG_ACTIVITY_SINGLE_TOP
其效果与指定Activity为singleTop模式一致。
FLAG_ACTIVITY_CLEAR_TOP
具备此标记位的Activity,当它启动时,在同一个任务栈中全部位于它上面的Activity都要出栈。若是和singleTask模式一块儿出现,若被启动的Activity已经存在栈中,则清除其之上的Activity,并调用该Activity的onNewIntent方法。若是被启动的Activity采用standard模式,那么该Activity连同之上的全部Activity出栈,而后建立新的Activity实例并压入栈中。若是和FLAG_ACTIVITY_NEW_TASK 一块儿使用时,则是一种在另外一个Task中定位现有Activity并将其放置在可以响应该意图的位置的方法。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
若是一个Intent中包含此属性,则它转向的那个Activity以及在那个Activity其上的全部Activity都会在task重置时被清除出task
最后说明下activity启动时如何选择task:
先判断target activity可否在新task中启动
singleTask/singleInstance的activity自己具备在新task中启动的能力,standard/singleTop的activity要想拥有在新task中启动的能力,须要在设置Intent.FLAG_ACTIVITY_NEW_TASK
判断target activity所在task
找一个taskAffinity的task去启动,找不到就新建一个(这里会忽略了singleInstance独占的task)
根据TargetActivity的启动模式判断会如何启动
在Activity窗口得到或失去焦点时被调用,
一、建立时首次呈如今用户面前;
二、当前Activity被其余Activity覆盖;
三、当前Activity转到其余Activity或按Home键回到主屏,自身退居后台;
四、用户退出当前Activity。
以上几种状况都会调用onWindowFocusChanged,而且当Activity被建立时是在onResume以后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause以后被调用
这个方法在某种场合下仍是颇有用的,例如程序启动时想要获取视特定视图组件的尺寸大小,在onCreate中可能没法取到,由于窗口Window对象还没建立完成,这个时候咱们就须要在onWindowFocusChanged里获取
保存activity状态
Activity A跳转到Activity B 二者经历怎样的生命周期 未配置configchanges状况下屏幕发生旋转时 当前Activity的生命周期是怎样变化的