2010-02-24 114 views
26

因此,我目前正在顯示通知。當用戶點擊這個通知時,應用程序就會啓動。通知仍然存在,表明服務正在後臺運行。通過通知開始活動:避免重複活動

Intent notificationIntent = new Intent(context, LaunchActivity.class); 
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 
mNotificationManager.notify(1, notification); 

但是,我發現了一個錯誤出現的情況。如果用戶通過單擊正常圖標啓動應用程序,並且活動正在運行時單擊該通知,則會啓動一個新的活動,而不在先前的活動退出,而後者位於早期的活動之上。這還不是全部:進一步點擊通知將創建額外的活動,並將它們放在已經運行的活動之上。我怎樣才能防止這一點?是否有一個很好的檢查來確定某個活動目前是正在顯示還是已加載?

回答

10

當使用lanchMode="singleTask",如果你的活動的實例已經存在,Android不重新創建活動,但與onNewIntent()方法啓動它。

如記錄由Android:

該系統在一個新的任務和路線的意圖,它的根目錄創建活動。但是,如果活動的實例已經存在,則系統通過調用onNewIntent()方法將意圖路由到現有實例,而不是創建新實例。

Android documentation for activity mode

2

由於兩個答案上面所提到的,你要的是設定在活動的定義定義清單中的應用程序的啓動模式:

<activity 
    android:name="com.company.ActivityName" 
    android:launchMode="singleTask"> 
</activity> 

另外,您可能要注意的是,儘管FLAG_ACTIVITY_SINGLE_TOP是一個有效的Intent標誌,但沒有用於singleTask或singleInstance的等效意圖標誌。

詳情請參見在不同的啓動模式選項的launchMode部分:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

+1

是FLAG_ACTIVITY_NEW_TASK不等於singleTask? – CopsOnRoad 2018-01-02 14:43:01