2

我有一個Activity,其launchMode是singleTop(在清單中)。我的理解是,如果Activity是singleTop並且位於活動堆棧的頂部,那麼使用新的Intent啓動Activity實際上會導致在Activity上調用onNewIntent(),而不會創建活動的新實例(因此,onCreate()不被調用)。singleTop即使在堆棧頂部時有時也會創建活動

此活動運行前臺服務,顯示正在進行的通知。選中後,此通知將簡單地將用戶帶回堆棧頂部的活動(沒有從此單一活動啓動的活動)。我的問題是,當選擇通知時,有時活動的新實例被創建 - 即使它明顯已經在堆棧頂部。這對於我的Activity來說是有問題的,因爲它的行爲對於在後臺被殺死並重新啓動的情況是不同的(相對於onNewIntent()而言)。我的服務使用呈現通知的代碼如下:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
stackBuilder.addParentStack(MainActivity.class); 

Intent notificationIntent = new Intent(this, MyProblematicActivity.class); 
notificationIntent.putExtra(EXTRA_MY_DATA, "MyData"); 
stackBuilder.addNextIntent(notificationIntent); 

PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

Notification.Builder notificationBuilder = new Notification.Builder(getApplicationContext()). 
     setSmallIcon(smallIconResourceId). 
     setContentTitle(contentTitle). 
     setContentText(contentText). 
     setAutoCancel(false). 
     setOngoing(true). 
     setContentIntent(pendingIntent); 

startForeground(MY_NOTIF_ID, notificationBuilder.build()); 

我說,這種行爲時有發生,而當它,它會做如此反覆。例如:

  1. MyProblematicActivity啓動首次
  2. 服務啓動和呈現通知
  3. 通知被選擇。
  4. MyProblematicActivity被重新創建(服務已經啓動,通知已經顯示)。
  5. 重複2-4個forevs。

偶爾,#3後,MyProblematicActivity的onNewIntent()被調用,而無需創建一個新的實例,以及事情的來龍去脈預期。

我不知道爲什麼會發生這種情況。任務根目錄下的狀態活動能否影響我的單個活動的行爲? FWIW,創建MyProblematicActivity的活動是一個singleTask活動。

回答

0
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

這個標誌添加到通知的意圖

+0

這並不能解決問題。正在創建一個活動的新實例,並且正在調用onCreate()。 – rrbrambley

0

我有同樣的事情在回答什麼科莫爾說,但只解釋這整個事情背後的原因,

如果使用 singleTop

,新實例只有當你的目標活動位於堆棧頂部時纔會被調用,如果它不在最上面,那麼新的意圖在onNewIntent()中收到;從而創建新實例。

所以,

附加標誌Intent.FLAG_ACTIVITY_CLEAR_TOP

如果您導航到當前堆棧上的活動,其行爲是由父活動的啓動模式決定。如果父級活動具有啓動模式singleTop(或者上級意圖包含FLAG_ACTIVITY_CLEAR_TOP),則父級會被帶到堆棧的頂部,並且其狀態將被保留。導航意圖由父活動的onNewIntent()方法接收。如果父活動具有啓動模式標準(並且向上意圖不包含FLAG_ACTIVITY_CLEAR_TOP),則當前活動及其父項都從堆棧彈出,並且創建父活動的新實例以接收導航意圖。

Documentation

+0

這並不能解決問題。正在創建一個活動的新實例,並且正在調用onCreate()。 – rrbrambley

1

你,因爲你正在使用TaskStackBuilder. The behaviour of TaskStackBuilder is that it always resets the task, which means that the活動will be created again. Don't use TaskStackBuilder for this, just call PendingIntent.getActivity()to get a的PendingIntent to add to your Notification`有這個問題。

+0

如果堆棧堆棧構建器總是重新創建事物。這在應用程序使用過程中沒有太大意義 – Remario

+0

@Remario但是這並不改變事實,即它正是如此。它構建完全新的任務堆棧!我從不使用'TaskStackBuilder',我總是建議開發人員不要使用它,除非他們完全理解它的功能。 –

+0

好的一點,你如何處理堆棧歷史呢? – Remario

相關問題