日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK

發布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

taskAffinity 和 FLAG_ACTIVITY_NEW_TASK都是和activity啟動時是否需要新建一個task有關,我們分四種情況看一下這兩個標志對啟動activity的影響:(前提:從MainActivity中啟動ActivityA)

1)、兩個標志都不設置
2)、有FLAG_ACTIVITY_NEW_TASK ?
3)、無FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)
4)、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

注意上面的標志都是針對于啟動的ActivityA,FLAG_ACTIVITY_NEW_TASK ?是在啟動ActivityA的Intent中設置的,taskAffinity 是在AndroidManifest中ActivityA中設置,另外注意這里兩個actiity的啟動模式都設置為standard

1、先看第一中情況:

主要代碼:

<activity android:name=".ActivityA" android:launchMode="standard" android:label="@string/title_activityA"> <intent-filter> <action android:name="com.leaves.ipanel.ActivityA"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>

MainActivity啟動activity
public void onClick(View arg0) { // TODO Auto-generated method stub Log.i(TAG, "--onClick--task id = " + getCurrentTaskId()); Intent intent = new Intent("com.leaves.ipanel.ActivityA"); startActivity(intent); }

啟動A之后的堆棧:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA} Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA } ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000}

可見,跟啟動他的activity同屬于一個task.

2、有FLAG_ACTIVITY_NEW_TASK ?

我們添加FLAG_ACTIVITY_NEW_TASK ?

public void onClick(View arg0) { // TODO Auto-generated method stub Log.i(TAG, "--onClick--task id = " + getCurrentTaskId()); Intent intent = new Intent("com.leaves.ipanel.ActivityA"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }

啟動A之后的堆棧
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA} Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA } ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000}
可見,跟啟動他的activity還是同屬于一個task.

3、無FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)


public void onClick(View arg0) { // TODO Auto-generated method stub Log.i(TAG, "--onClick--task id = " + getCurrentTaskId()); Intent intent = new Intent("com.leaves.ipanel.ActivityA"); startActivity(intent); }

<activity android:name=".ActivityA" android:launchMode="standard" android:taskAffinity="com.leaves.test.ActivityA" android:label="@string/title_activityA"> <intent-filter> <action android:name="com.leaves.ipanel.ActivityA"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
查看一下啟動A之后的堆棧: ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA} Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA } ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000}
跟前面兩種情況是一樣的。

4、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

把FLAG_ACTIVITY_NEW_TASK添加上去


public void onClick(View arg0) { // TODO Auto-generated method stub Log.i(TAG, "--onClick--task id = " + getCurrentTaskId()); Intent intent = new Intent("com.leaves.ipanel.ActivityA"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
查看一下啟動A之后的堆棧:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{4140d4c8 #42 A com.leaves.test.ActivityA U 0} Intent { act=com.leaves.ipanel.ActivityA flg=0x10000000 cmp=com.leaves.ipanel/.ActivityA } Hist #2: ActivityRecord{416b48d8 u0 com.leaves.ipanel/.ActivityA} Intent { act=com.leaves.ipanel.ActivityA flg=0x10000000 cmp=com.leaves.ipanel/.ActivityA } ProcessRecord{41393ed0 8028:com.leaves.ipanel/u0a10061} TaskRecord{4231cf40 #41 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } Hist #1: ActivityRecord{413c8430 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity } ProcessRecord{41393ed0 8028:com.leaves.ipanel/u0a10061} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000}
可以看到,這次終于在一個新的task中啟動了ActivityA.

上面我們測試的兩個Activity是在同一個應用中,如果他們在不同的應用中呢,例如ActivityA跟MainActivity不在一個apk中,其實情況還是一樣的,只是這個時候,如果沒有在AndroidManifest.xml中設置taskAffinity,則他們兩個的taskAffinity是不一樣的。因為默認如果沒有設置taskAffinity,則taskAffinity跟包名是一樣的,所以,如果ActivityA跟MainActivity不在一個apk中,當沒有FLAG_ACTIVITY_NEW_TASK時,則兩者應該是在同一個task,但是如果有FLAG_ACTIVITY_NEW_TASK,則兩者應該會在不同的task中。


總結:

如果沒有設置FLAG_ACTIVITY_NEW_TASK,且是從一個activity中啟動另一個activity,即sourceRecord不為null,則設置新啟動的TaskRecord為即sourceRecord的TaskRecord
如果設置了FLAG_ACTIVITY_NEW_TASK,則根據task的 affinity、intent、ComponentName等查找是否有合適的TaskRecord

這些工作的解析還是在ActivityStack.Java的startActivityUncheckedLocked函數中進行的。

總結

以上是生活随笔為你收集整理的Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。