1、Activity生命周期:
Activity生命周期主流程:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
Activity1打开Activity2,生命周期流程:
Activity1:onPause()->Activity2:oCreate()->onStart()->onResume()->Activity1:onStop()
Activity2回到Activity1的生命周期流程:
Activity2:onPause()->Activity1:onRestart()->onStart()->onResume()->Activity2:onStop()->onDestory()
Activity1弹出Activity2对话框生命周期流程:
Activity1:onPasue()->Activity2:onCreate()->onStart()->onResume()
Activity2对话框弹出时 点击Home键的生命周期流程:
Activity2:onPause()->onStop()->Activity1:onStop()
从桌面回到Activity2对话框打开的界面:
Activity1:onRestart()->onStart->Activity2:onRestart()->onStart()->onResume()
Activity横屏变竖屏生命周期的流程:
onPause()->onSaveInstanceState()->onStop()->onDestory->onCreate()->onStart()->onRestoreInstanceState()->onResume()
2、Activity四种启动模式:
standard(标准模式、默认模式):
Activity开启的默认模式。每当创建一个新的Activity实例,都会在栈顶新建一个Activity。
如:栈中有ABCD四个Activity,D_Activity的启动模式为standard,那么当实例化一个新的D_Activity的时候,任务栈就变成了ABCDD。
singleTop(栈顶复用模式):
这种模式的情况下,如果此Activity在栈顶,那么就不会创建新的Activity,但此Activity的onNewIntent()方法会被调用;如果不在栈顶,就在栈顶创建新的Activity。
如:占中有ABCD四个Activity,C_Activity和D_Activity的启动模式都为singleTop。当前实例化一个新的D_Activity的时候,栈内变化为ABCD(没变化)。当时实例化一个新的C_Activity的时候,站内变化为ABCDC。
singleTask(栈内复用模式):
这种模式的情况下,栈内不会存在重复的Activity。和singleTop模式一样,启动新的Activity的时候不会实例化新的Activity,而是调用onNewIntent()方法。该模式下也可指定任务栈,若不存在指定的任务栈,就创建新的任务栈,再实例化Activity;若存在指定的任务栈,该任务栈中是否存该Activity,若存在,调用onNewIntent();若不存在,实例化新的Activity。(任务栈默认为项目的包名,可通过设置TaskAffinity指定)
如:
1. 有ABCD四个Activity存在任务栈内,且C_Activity,D_Activity的启动模式为singleTask。当实例化新的D时,任务栈的变化为ABCD(无变化),D_Activity生命周期为:onPause()->onNewIntent()->onResume();当实例化C时,任务站的变化为ABC,C_Activity生命周期为:onNewIntent()->onRestart()->onStart()->onResume()。
2.任务栈S1中有ABC三个Activity,任务栈S2中有ABCD四个Activity,C_Activity的启动模式为singleTask。当在S1任务栈中实例化一个新的C,且指定在S2任务栈中启动,那么S1任务栈:ABC(无变化),S2任务栈:ABC。
singleInstance(单实例模式):
这是一种加强了的singleTask的模式。具有此模式的Activity启动时,系统会新创建一个任务栈存放此Activity,且只存放这个Activity,之后再实例化新的Activity时,也不会再创建。
标记:(优先级高于xml中设置launchMode)
FLAG_ACTIVITY_NEW_TASK:其作用等同于singleTask
FLAG_ACTIVITY_SINGLE_TOP:其作用等同于singleTop
FLAG_ACTIVITY_CLEAR_TOP:具有此标记的Activity启动时,在同一个栈中位于它上面的Activity都要出栈。这个模式一般和FLAG_ACTIVITY_NEW_TASK配合使用,如果Activity已存在,则调用它的onNewIntent()。如果启动的Activity采用的是standard模式,那么它连同他之上的Activity都要出栈,系统会创建新的实例存入栈中。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有此标记的Activity不会出现在历史Activity的列表中。某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。
3、IntentFilter的匹配规则:
只有Intent同时匹配action类别、category类别、data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。另外一点,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。
action的匹配规则:
action是一个字符串。匹配规则:Intent中的action存在且必须与过滤规则中的其中一个action相同。(action区分大小写)
category的匹配规则:
category是一个字符串。匹配规则:Intent中可以没有category,一旦有,不管几个都要和目标Activity的category一一对应。
可以没有的原因:系统在调用startActivity或者startActivityForResult的时候会默认加上“android.intent.category.DEFAULT”这个category。同时,为了我们的Activity能够接收到隐式调用,就必须在intent-filter中指定“android.intent.category.DEFALULT”这个category。
data的匹配规则:
data匹配规则和action类似。如果过滤条件中定义了data,那么Intent中必须也要定义可匹配的data。(完全匹配)
data的属性字段:
android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"
data主要有mimeType和URI组成。mimeType是文件类型。例如:image/jpeg。URI的结构如下:
<scheme>://<host>:<hort>/[<path>|<pathPsttern>|<pathPrefix>]