2017-08-11 65 views
0

我創建一個自定義的應用程序快捷方式的意圖類似以下內容:意圖爲活動帶來了另一個活動前

Intent.ShortcutIconResource icon = ...; 
Intent intent = new Intent(); 
Intent launchIntent = new Intent(getThis(), HandleShortcutActivity.class); 
// add a few user settings 

而且活動處理的意圖類似以下內容:

public class HandleShortcutActivity extends AppCompatActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_helper); 

     // get data from intent 
     // ... 
     // handle the action 
     // ... 

     // finish this activity instantly again 
     finish(); 
    } 
} 

而這裏的我的清單:

<activity 
    android:name=".activities.MainActivity" 
    android:windowSoftInputMode="adjustPan" 
    android:launchMode="singleTask" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

<activity 
    android:name=".activities.HandleShortcutActivity" 
    android:configChanges="orientation|screenSize" 
    android:excludeFromRecents="true" 
    android:noHistory="true" 
    android:theme="@style/Theme.Transparent" 
    android:launchMode="singleTask"> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
    </intent-filter> 

</activity> 

問題

如果MainActivity正在後臺運行,並且我的快捷方式意圖已啓動,則我的MainActivity已排在前面。爲什麼?我怎樣才能避免這種情況?

+1

爲什麼你完成();你在onCreate()中的活動? –

+0

@MohdSaquib因爲快捷操作已經處理完畢,並且不需要任何可視化界面,就像活動 – prom85

+0

問題出在您的清單代碼中刪除android:launchMode =「singleTask」 –

回答

1

你所需要的就是設定一個「任務親」,讓你的任務是,它是不相關的MainActivity一個新的堆棧的一部分創建。然後,當你finish()它,它會關閉HandleShortcutActivity,而不是去 「回」 到MainActivity

official docs: -

安卓taskAffinity

的任務活動對...有親和力。具有 相同親和性的活動在概念上屬於同一任務(從用戶的角度來看同一個 「應用程序」)。任務的親和力由其根活動的親和力決定,爲 。親和力 確定了兩件事 - 活動重新分配給 (參見allowTaskReparenting屬性)的任務以及將使用FLAG_ACTIVITY_NEW_TASK標誌啓動該活動時將包含 活動的任務。

默認情況下,應用程序中的所有活動都具有相同的關聯性。 您可以設置此屬性以不同方式對它們進行分組,甚至可以在同一任務中的不同應用程序中定義的活動。若要 指定該活動不具有任何任務的關聯性,請將其設置爲空字符串 。

如果未設置此屬性,則該活動會繼承應用程序的關聯集合 (請參閱元素的taskAffinity 屬性)。應用程序的默認關聯名稱是該元素設置的包名稱 。

HandleShortcutActivity在清單文件中添加taskAffinity後:

<activity 
    android:name=".activities.HandleShortcutActivity" 
    android:configChanges="orientation|screenSize" 
    android:excludeFromRecents="true" 
    android:noHistory="true" 
    android:theme="@style/Theme.Transparent" 
    android:launchMode="singleTask" 
    android:taskAffinity=""> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
    </intent-filter> 

</activity> 

爲了解釋這種情況下會發生什麼,看到下面的圖與任務#1爲您的呼叫任務/活動和任務# 2成爲您的HandleShortcutActivity

Single Task Launch mode with Task Affinity Set

我發現this article在瞭解不同的Android啓動模式時非常有用,並解釋了您可能會非常連貫的各種場景。

0

從清單文件中的Activity聲明中刪除android:launchMode="singleTask"。 此啓動模式搜索Activity在任務堆棧中,如果可用則從堆棧中取出並且未創建MainActivity的新實例。

0

更新您的清單......

<activity 
    android:name=".activities.MainActivity" 
    android:windowSoftInputMode="adjustPan" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
相關問題