一个Activty的生命周期





Activty的生命周期的也就是它地点过程的生命周期。





每一个活动( Activity )都处于某一个状况,对于开辟者来说,是无法把握其应用法度处于某一个状况的,这些均由体系来完成。
然则当一个活动的状况产生改变的时辰,开辟者可以经由过程调用 onXX() 的办法获取到相干的通知信息。





在实现 Activity 类的时辰,经由过程覆盖( override )这些办法即可在你须要处理惩罚的时辰来调用。




  • onCreate :当活动第一次启动的时辰,触发该办法,可以在此时完成活动的初始化工作。
    onCreate 办法有一个参数,该参数可认为空( null ),也可所以之前调用 onSaveInstanceState ()办法保存的状况信息。
  • onStart :该办法的触发默示所属活动将被显现给用户。
  • onResume :当一个活动和用户产生交互的时辰,触发该办法。
  • onPause :当一个正在前台运行的活动因为其他的活动须要前台运行而转入后台运行的时辰,触发该办法。这时辰须要将活动的状况持久化,比如正在编辑的数据库记录等。
  • onStop :当一个活动不再须要显现给用户的时辰,触发该办法。若是内存严重,体系会直接停止这个活动,而不会触发 onStop 办法。 所以保存状况信息是应当在onPause时做,而不是onStop时做。活动若是没有在前台运行,都将被停止或者Linux经管过程为了给新的活动预留足够的存储空间而随时停止这些活动。是以对于开辟者来说,在设计应用法度的时辰,必须时刻紧记这一原则。在一些景象下,onPause办法或许是活动触发的最后的办法,是以开辟者须要在这个时辰保存须要保存的信息。
  • onRestart :当处于停止状况的活动须要再次显现给用户的时辰,触发该办法。
  • onDestroy :当活动烧毁的时辰,触发该办法。和 onStop 办法一样,若是内存严重,体系会直接停止这个活动而不会触发该办法。
  • onSaveInstanceState :体系调用该办法,容许活动保存之前的状况,比如说在一串字符串中的光标所处的地位等。
    凡是景象下,开辟者不须要重写覆盖该办法,在默认的实现中,已经供给了主动保存活动所涉及到的用户界面组件的所有状况信息。




关于activity的四种加载模式



在android的多activity开辟中,activity之间的跳转可能须要有多种体式格式,有时是通俗的生成一个新实例,有时欲望跳转到本来某个activity实例,而不是生成多量的反复的activity。加载模式便是决意以哪种体式格式启动一个跳转到本来某个Activity实例。



在android里,有4种activity的启动模式,分别为:




  • standard: 标准模式,一调用startActivity()办法就会产生一个新的实例。
  • singleTop: 若是已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()办法。若是不位于栈顶,会产生一个新的实例。
  • singleTask: 会在一个新的task中产生这个实例,今后每次调用都邑应用这个,不会去产生新的实例了。


       哄骗intent传递数据时必须重写:onNewIntent



    





View Code


1 @Override 2 protected void onNewIntent(Intent intent) { 3 4 if (intent.getStringExtra("photoPath") != null) { 5 System.out.println(intent.getStringExtra("photoPath") 6 + " takephoto :" + takephoto.getVisibility()); 7 tempFile = new File("/sdcard/a.jpg"); 8 ps(); 9 } 10 super.onNewIntent(intent); 11 }








  • 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键返回到这之前的状况。