啟動模式還是比較難以理解的,雖然我盡量用最簡單的方式來陳述,但原諒在下裝逼功力有限,建議還是必須對著代碼敲一遍
一: Actiivity和Task
- Activity屬于哪個Task,由什么來決定的?
- Activity會一直在這個task中嗎?
- 如果不是又會到什么樣的task中呢?
這一切都可以在Activity的taskAffinity屬性中找到答案,Activity的taskAffinity屬性決定了它在哪個Task中
二 :Activity的taskAffinity屬性和task的taskAffinity屬性值
- 每個Activity都有taskAffinity屬性,這個屬性指出了它希望進入的Task
- 如果一個Activity沒有顯示指明taskAffinity屬性,那么它的taskAffinity屬性就是Application指明的taskAffinity屬性
- 如果Application中也沒有指明的taskAffinity屬性,那么該taskAffinity的值就等于包名
- Task的taskAffinity屬性值等于根Activity的taskAffinity的屬性值。(根Activity:該Task里最底層的Activity)
三:一般情況下創建的Activity都會在創建它的Task中,并且大部分都在這里度過了它的整個生命。然而有一些情況,創建的Activity會被分配其它的Task中去,有的甚至,本來在一個Task中,之后出現了轉移--我們叫他重新宿主。有兩種情況
- 如果該Activity的allowTaskReparenting設置為true,它進入后臺,當一個和它有相同affinity的Task進入前臺時,它會重新宿主,進入到該前臺的task中。看個小栗子,驗證下是否正確
- 這里我們新建兩個Application ApplicationFirst 和ApplicationSecond 并給兩個Appliction設置相同的taskAffinity屬性值,但是ApplicationFirst設置 allowTaskReparenting設置為true。
- 現在我們先點開ApplicationFirst,然后home鍵,在點開ApplicationSecond,我們看到的界面確實ApplicationFirst的界面,為什么呢?本來應該是顯示ActivitySecond,但是我們卻看到了ActivityFirst。實際上ActivitySecond也被加載了,只是ActivityFirst重新宿主,所以看到了ActivityFirst。
- 如果加載某個Activity的intent,Flag被設置成FLAG_ACTIVITY_NEW_TASK時,它會首先檢查是否存在與自己taskAffinity相同的Task,如果存在,那么它會直接宿主到該Task中,如果不存在則重新創建Task。
新建一個ApplicationTwo,taskAffinity屬性設置為: android:taskAffinity="com.zyg.test"
AndroidManifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhang.testing.applicationtwo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:taskAffinity="com.zyg.test"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
在建立個ApplicationOne ,一個MainAcitivity 一個NewTaskFlag 的Activity,我們用MainActivity啟動NewTaskFlag ,并設置
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView view= (TextView) findViewById(R.id.btn_newTaskflag);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, NewTaskFlag.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
}
}
ApplicationOne 的AndroidManifest文件。NewTaskFlag 給這個Activity設置 android:taskAffinity="com.zyg.test",和ApplicationTwo的taskAffinity 值一樣。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhang.testing.applicationone">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".NewTaskFlag"
android:taskAffinity="com.zyg.test"
>
</activity>
</application>
</manifest>
然后我們先啟動ApplicationTwo,然后Home鍵,在啟動ApplicationOne,然后主界面跳轉到NewTaskFlag activity界面。然后我們開始回退鍵。發現了什么嗎?看到退出的順序了嗎? NewTaskFlag 然后avtivitySecond (ApplicationTwo對應的Activity) 然后MainActivity 。那么說明了什么?當啟動NewTaskFlag ,會先檢查有沒有和自己taskAffinity相同的Task,如果存在,那么它會直接宿主到該Task中,如果不存在則重新創建Task。
如有錯誤,歡迎指正,謝謝,如轉載請在文章中明顯注明出處