2015-09-28 82 views
4

我有兩個活動:活動A和活動B.活動A的啓動模式是標準的,而活動B的啓動模式是singleTask。launchMode =「singleTask」不創建新任務

<activity 
    android:name=".AActivity" 
    android:label="@string/app_name" 
    android:launchMode="standard"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <data android:scheme="dd"></data> 
     <data android:host="a"></data> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
    </intent-filter> 
</activity> 
<activity 
    android:name=".BActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTask"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <data android:scheme="dd"></data> 
     <data android:host="b"></data> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
    </intent-filter> 
</activity> 

我啓動應用程序,啓動程序活動A啓動。然後我按Home按鈕並返回到手機的主屏幕。然後我啓動瀏覽應用程序,並鍵入以下內容:

dd://b 

打開活動B.系統導航到我的應用程序和活動A.頂部開始活動B在這一點上,如果我按後退按鈕,活動B是突然出現,我看到活動A.

這不是我所期待,因爲Android文檔指出:

對於singleTask活動,系統會創建一個新的任務和新任務的根實例活動。但是,如果活動的實例已經存在於單獨的任務中,則系統通過調用onNewIntent()方法將意圖路由到現有實例,而不是創建新實例。一次只能有一個活動實例。

我從這些句子理解是什麼,因爲活動的一個實例,B不存在我的情況下,一個新的任務應該已經啓動,它應該在它的棧(另一個例子只有活動B我應用程序應該仍然存在於一個單獨的任務中,並且它的堆棧中應該有Activity A)。然後,如果我在活動B時按下按鈕,因爲它是後臺堆棧中的唯一活動,它會彈出並且系統返回到瀏覽器。

爲什麼不是這樣? android系統如何知道我的應用程序已打開並導航到它,並在現有應用程序堆棧上啓動活動B,而不是啓動我的應用程序的另一個實例,並讓我的應用程序的兩個實例擁有自己的堆棧? 在新任務中實例化活動意味着什麼?任何人都可以解釋嗎?

謝謝。

回答

3

除了公認的答案調用B之後,我發現了一個解釋這個問題。正如android文檔所述:

親和力表示活動更喜歡屬於哪個任務。默認情況下,來自同一個應用程序的所有活動都相互關聯。因此,默認情況下,同一應用程序中的所有活動都喜歡在屬於該應用程序的相同任務中(具有活動B的應用程序)。但是,您可以修改某個活動的默認關聯。

所以,如果您的應用程序正在運行,並且開始一個活動,其中有launchMode:singleTask屬性,除非你明確指出taskAffinity屬性,它開始在同一個任務的活動。但是,如果您在清單中明確聲明親和力:

<activity 
     android:name=".BActivity" 
     android:label="@string/app_name" 
     android:taskAffinity="" 
     android:launchMode="singleTask"> 
</activity> 

然後它開始新任務中的活動。

可以看到哪些活動屬於哪個任務由以下ADB命令:

adb shell dumpsys activity 

而且,以更好地瞭解launchMode概念,你可以看到谷歌以下Play應用程式:https://play.google.com/store/apps/details?id=com.novoda.demos.activitylaunchmode

+0

這進一步解釋了它。很好的發現。 –

+0

android文檔聲明「singleTask:系統創建一個新任務並在新任務的根目錄下實例化活動」。然後補充道:「無論一項活動是從一項新任務開始,還是在與開始它的活動相同的任務中,」後退「按鈕始終將用戶帶到之前的活動。那麼,如何確保」singleTask「無法啓動一個默認的新任務?https://developer.android.com/guide/components/activities/tasks-and-back-stack.html – feresr

+0

https://issuetracker.google.com/issues/36921210 – mhsmith

0

你說你的應用導航到B路過A. A

所以,我認爲你有兩個堆棧。在第一個中,你只有A,在第二個中你只有B。如果你按回來,B彈出並消失,但是A存在並且正在顯示,因爲A在B後面,即使A和B在單獨的堆棧中。

如果你想是b的流行,然後你回到家裏,嘗試調用「完成()」從A

相關問題