倡议首先浏览上面两篇文章,这样才能够更好的了解Activity的加载模式:
Android的过程,线程模型
其中对“Android的单线程模型”的形容,明确Activity的一些注意事项。
Android Application Task Activities的关系
尤其要明确 Task 是啥。
一个Activty的生命周期
Activty的生命周期的也就是它所在过程的生命周期。
每一个流动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由零碎来实现。
然而当一个流动的状态产生扭转的时候,开发者能够通过调用 onXX() 的办法获取到相干的告诉信息。
在实现 Activity 类的时候,通过笼罩( override )这些办法即可在你须要解决的时候来调用。
onCreate :当流动第一次启动的时候,触发该办法,能够在此时实现流动的初始化工作。
onCreate 办法有一个参数,该参数能够为空( null ),也能够是之前调用 onSaveInstanceState ()办法保留的状态信息。
onStart :该办法的触发示意所属流动将被展示给用户。
onResume :当一个流动和用户产生交互的时候,触发该办法。
onPause :当一个正在前台运行的流动因为其余的流动须要前台运行而转入后盾运行的时候,触发该办法。这时候须要将流动的状态长久化,比方正在编辑的数据库记录等。
onStop :当一个流动不再须要展现给用户的时候,触发该办法。如果内存缓和,零碎会间接完结这个流动,而不会触发 onStop 办法。 所以保留状态信息是应该在onPause时做,而不是onStop时做。流动如果没有在前台运行,都将被进行或者Linux治理过程为了给新的流动预留足够的存储空间而随时完结这些流动。因而对于开发者来说,在设计应用程序的时候,必须时刻牢记这一准则。在一些状况下,onPause办法或者是流动触发的最初的办法,因而开发者须要在这个时候保留须要保留的信息。
onRestart :当处于进行状态的流动须要再次展示给用户的时候,触发该办法。
onDestroy :当流动销毁的时候,触发该办法。和 onStop 办法一样,如果内存缓和,零碎会间接完结这个流动而不会触发该办法。
onSaveInstanceState :零碎调用该办法,容许流动保留之前的状态,比如说在一串字符串中的光标所处的地位等。
通常状况下,开发者不须要重写笼罩该办法,在默认的实现中,曾经提供了主动保留流动所波及到的用户界面组件的所有状态信息。
Activity栈
下面提到开发者是无法控制Activity的状态的,那Activity的状态又是依照何种逻辑来运作的呢?这就要晓得 Activity 栈。
每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,蕴含所有正在运行Activity的队列)中的地位决定的。
当一个新的Activity启动时,以后的流动的Activity将会移到Activity栈的顶部。
如果用户应用后退按钮返回的话,或者前台的Activity完结,在栈上的Activity将会移上来并变为活动状态。如下图所示:
一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去开释资源,Android内存治理应用栈来决定基于Activity的应用程序的优先级。
Activity状态
个别认为Activity有以下四种状态:
流动的:当一个Activity在栈顶,它是可视的、有焦点、可承受用户输出的。Android试图尽最大可能放弃它活动状态,杀死其它Activity来确保以后流动Activity有足够的资源可应用。当另外一个Activity被激活,这个将会被暂停。
暂停:在很多状况下,你的Activity可视然而它没有焦点,换句话说它被暂停了。有可能起因是一个通明或者非全屏的Activity被激活。
当被暂停,一个Activity仍会当成活动状态,只不过是不能够承受用户输出。在极非凡的状况下,Android将会杀死一个暂停的Activity来为流动的Activity提供短缺的资源。当一个Activity变为齐全暗藏,它将会变成进行。
进行:当一个Activity不是可视的,它“进行”了。这个Activity将依然在内存中保留它所有的状态和会员信息。尽管如此,当其它中央须要内存时,它将是最有可能被开释资源的。当一个Activity进行后,一个很重要的步骤是要保留数据和以后UI状态。一旦一个Activity退出或敞开了,它将变为待用状态。
待用: 在一个Activity被杀死后和被装在前,它是待用状态的。待用Acitivity被移除Activity栈,并且须要在显示和可用之前重新启动它。
activity的四种加载模式
在android的多activity开发中,activity之间的跳转可能须要有多种形式,有时是一般的生成一个新实例,有时心愿跳转到原来某个activity实例,而不是生成大量的反复的activity。加载模式便是决定以哪种形式启动一个跳转到原来某个Activity实例。
在android里,有4种activity的启动模式,别离为:
standard: 规范模式,一调用startActivity()办法就会产生一个新的实例。
singleTop: 如果曾经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()办法。如果不位于栈顶,会产生一个新的实例。
singleTask: 会在一个新的task中产生这个实例,当前每次调用都会应用这个,不会去产生新的实例了。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其余的实例。
这些启动模式能够在性能清单文件AndroidManifest.xml中进行设置,<activity>中的launchMode属性。
相干的代码中也有一些标记能够应用,比方咱们想只启用一个实例,则能够应用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标记,这个标记示意:如果这个activity曾经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就能够了。
Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
intent.addFlags(Intent.FLAG\_ACTIVITY\_REORDER\_TO\_FRONT);
startActivity(intent);
Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的<activity>元素的个性值交互管制。
上面是影响加载模式的一些个性
外围的Intent Flag有:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
外围的<activity>个性有: taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
四种加载模式的区别
所属task的区别
个别状况下,“standard”和”singleTop”的activity的指标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。
除非Intent包含参数FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
“singleTask”和”singleInstance” 总是把要启动的activity作为一个task的根元素,他们不会被启动到一个其余task里。
是否容许多个实例
“standard”和”singleTop”能够被实例化屡次,并且是能够存在于不同的task中;这种实例化时一个task能够包含一个activity的多个实例;
“singleTask”和”singleInstance”则限度只生成一个实例,并且是task的根元素。
singleTop 要求如果创立intent的时候栈顶曾经有要创立的Activity的实例,则将intent发送给该实例,而不创立新的实例。
是否容许其它activity存在于本task内
“singleInstance”独占一个task,其它activity不能存在那个task里;
如果它启动了一个新的activity,不论新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。
而另外三种模式,则能够和其它activity共存。
是否每次都生成新实例
“standard”对于每一个启动Intent都会生成一个activity的新实例;
“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,间接应用栈顶的实例,否则,生成该activity的实例。
比方:
当初task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
如果这时候给B发Intent的话,不论B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
“singleInstance”是其所在栈的惟一activity,它会每次都被重用。
“singleTask” 如果在栈顶,则承受intent,否则,该intent会被抛弃,然而该task仍会回到前台。 当曾经存在的activity实例解决新的intent时候,会调用onNewIntent()办法,如果收到intent生成一个activity实例,那么用户能够通过back键回到上一个状态;如果是曾经存在的一个activity来解决这个intent的话,用户不能通过按back键返回到这之前的状态。
Android——Activity栈,Android Task 工作栈,Android下打印调用栈,Android中的工作栈,android的task工作栈,android java 打印调用栈,android java 调用栈,android python全栈开发,android studio查看以后栈,android studio调用栈
本文转自 https://blog.51cto.com/u_1504…,如有侵权,请分割删除。