Activity的生命周期及启动模式(开发艺术)

1、典型情况下的生命周期(指在有用户参与的情况下,activity所经历的生命周期的改变)

  Activity的生命周期及启动模式(开发艺术)

2、异常情况下的activity的生命周期(activity被系统回收或者由于当前的Configuration发生改变从而导致activity被销毁重建)

  Activity的生命周期及启动模式(开发艺术)

onSaveInstanceState方法在onStop方法之前调用,onRestoreInstanceState方法在onStart方法之后调用。

    (1)、在AndroidMenifest.xml中指定configChanges属性为orientation|screenSize则横竖屏切换时不在重新创建activity只是调用onConfigurationChanged这个方法【不调用生命周期中的方法】。

3、standard(标准启动模式):Android的默认启动模式。当启动一个activity时都会创建一个新的activity的实例,不管这个实例是否存在。谁启动了这个模式下的activity,那么这个activity就运行在启动它的那个activity所在的栈中【当单实例模式启动它的时候这个activity没在这个单实例模式所在的栈中,相当于待启动的activity指定了FLAG_ACTIVITY_NEW_TASK标记位】。

4、singleTop(栈顶复用模式):如果启动的activity已经位于栈顶了,则不会重新创建新的activity的实例,而是会回调这个activity的onNewIntent方法;如果启动的activity不在栈顶,则会重新创建activity的实例【谁启动了就在那个启动的activity的任务栈中】。

5、singleTask(栈内复用模式):如果新启动的activity已经在栈中存在,则不会重新创建新的activity的实例,而是会回调这个activity的onNewIntent方法;如果不存在,则会创建新activity的实例。

  • Android5.0之后A -> B(singleTask) -> C(startActivityForResult) -> B(新创建的);Android5.0之前A -> B(singleTask) -> C(startActivityForResult) -> B(不会显示,直接跳到C的onResult方法中)
  • 在activityA启动activityB时,发现activityB启动模式为singleTask,那么设定他的启动标志为FLAG_ACTIVITY_NEW_TASK
  • 然后获得activityB的taskAffinity,如果没有设置默认为包名
  • 检查是否已经存在一个affinity的任务,如果不存在创建一个任务栈
  • 既然已经存在这个任务,就检索在这个任务中是否存在一个activityB的实例
  •  如果存在activityB实例,调用它的onNewIntent方法调到栈顶弹出它上面的实例;如果不存在,创建它的实例并压入栈中

6、singleInstance(单实例模式):它除了有singleTask模式的所有特性外,还加强了一点,这个模式的activity只能单独地位于一个任务栈中【activityA为单例模式,activityB为标准模式或者栈顶复用模式,activityC为除单例模式之外的其它模式,其余默认,A -> B -> C -> A -> B显示的是C,解决方法是在B中添加taskAffinity这个属性】。

(1)、回调onNewIntent方法时,当用户操作的activity为A,再次打开activityA时,此时调用onPause、onNewIntent、onResume方法;当用户操作的activity为B,再次打开activityA(在栈顶或者为singleTask),此时调用onNewIntent、onRestart、onStart、onResume。

(2)、TaskAffinity(任务相关性):这个参数标识了一个activity所需要的任务栈的名字,默认情况下,所有activity所需的任务栈的名字为应用程序的包名。这个属性主要和singleTask启动模式或者allowTaskReparenting属性(没测试过,不太清楚)配对使用,在其他情况下没意义。

(3)、两种方法指定启动模式,一种是在AndroidMenifest.xml中为activity指定launchMode属性;另一种是在启动新的activity时调用addFlags方法,给这个方法传递参数。首先,第二种方式优先级高于第一种,当并存时以第二种为准;其次,两种方式在限定范围上有所不同,第一种无法直接为activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式无法为activity指定singleInstance模式。

(4)、启动标志

  • FLAGE_ACTIVITY_NEW_TASK:为activity指定singleTask启动模式
  • FLAGE_ACTIVITY_SINGLE_TOP:为activity指定singleTop启动模式
  • FLAG_ACTIVITY_CLEAR_TOP:当启动具有此标记位的activity时,在同一个任务栈中位于它上面的activity都要出栈
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的activity不会出现在历史activity的列表中

Android中activity四种启动模式和taskaffinity详解

7、action类别:一个字符串,区分大小写。action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同【如果要是隐式启动必须要至少有一个action】。

8、category类别:一个字符串,区分大小写。了cateintent中如果出现gory,不管有几个category,必须是过滤规则中已经定义了的;也可以没有,系统会默认intent加上android.intent.category.DEFAULT,这个时候过滤规则中必须有这个规则。

9、data类别:有两部分组成,mimeType和URI。当没有指定URI的时候,默认的为file和content。

(1)mimeType:可以表示图片、文本、视频等不同的媒体格式。

(2)URI<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]:scheme,URI模式,比如http、file等,如果URI中没有指定scheme,那么整个URI的其他参数无效,这也意味着URI是无效的;Host,URI的主机名,比如www.baidu.com,如果URI中没有指定Host,那么整个URI的其他参数无效,这也意味着URI是无效的;Port,URI中的端口号,比如80,仅当URI中指定了scheme和host参数的时候port参数才有意义;Path、pathPattern和pathPrefix,这三个参数表示路径信息,其中path表示完整的路径信息,pathPattern也表示完整的路径信息,但是他里面可以包含通配符“*”,“*”表示0个或多个任意字符,pathPrefix表示路径的前缀信息。

感谢《Android开发艺术探索》。