2012-12-10 62 views
21

我試圖實現描述爲here的行爲,其中通知(或其他)在您的應用中啓動「內部」活動,然後當用戶將其按回時我的「家」活動。返回創建通知活動的主要活動

Android的文檔說

在後退按鈕的情況下,你應該將其插入任務的背部棧的完整 向上導航路徑的應用程序的最上面的屏幕使導航更 預見。這允許用戶 忘記了他們在退出之前輸入您的應用程序以導航到應用程序的最頂端屏幕 。

是否有一個很好的方法來實際做到這一點?關於Stackoverflow的其他問題建議開始主要活動的意圖,告訴它開始內部活動,但這似乎是一個巨大的黑客攻擊,我有些懷疑Google會在Gmail中使用,並且我假設有一個體面的方法,給定他們正在倡導這種行爲。

那麼,有沒有一種非哈克的方式來做到這一點?

回答

55

啊哈,我只需要用PendingIntent.getActivities()而不是getActivity()。另外值得一提的是TaskStackBuilder

下面是一些代碼:

Intent backIntent = new Intent(ctx, MainActivity.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Intent intent = new Intent(ctx, ConversationActivity.class); 
    intent.putExtra("whatever", whatever); 
    final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, 
      new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT); 

只是測試它。它像一個魅力。我最初懷疑如果應用程序已經運行,可能會有問題,並且您會去通知。即說你的活動堆棧(最頂層右邊):

[MainActivity] [SomeActivity] 

,你點擊一個通知ConversationActivity。你會得到:?

[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity] 

哦,原來你奇蹟般地得到

[MainActivity] [SomeActivity] [ConversationActivity] 

這是我想要的東西,但我不知道它是如何做到這一點。我沒有對任何活動設置任何特殊選項。好吧!

+0

不幸的是,這似乎不適用於我。我的MainActivity確實再次被推到導航棧上,並且它只對一個通知有效(我不會自動解僱它們)。有任何想法嗎? – bompf

+1

@bompf,這可能是因爲在PendingIntent.getActivities中使用了PendingIntent.FLAG_ONE_SHOT。我建議'PendingIntent.FLAG_CANCEL_CURRENT'。 – Sam

+1

謝謝;這對我有效,而'TaskStackBuilder'似乎不起作用。然而,你的代碼導致了一個奇怪的情況:如果我通過啓動器打開了'MainActivity',然後從通知中打開了操作,在按下返回按鈕返回到'MainActivity'之後,按下後​​退按鈕導致它返回'MainActivity'再次。像這樣:'[MainActivity] [MainActivity] [ConversationActivity]'。我通過將第二行代碼更改爲'backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)'來修復它。 – Sam

1

我知道2點的方式實現這一目標:

  1. 啓動home activity從活動中被通知開始。這可能會變得非常詭異,因爲您必須區分並跟蹤各種可能的入口點。
  2. 您總是從您home activity開始,它檢查是否正在通過通知啓動,然後啓動notification activity。這確保了一個一致的入口點,並且當用戶按下向上鍵時後退堆疊將在那裏。

問候。

0

不錯。

但請注意,這是不適用於前3。0(預API級別11)系統,因爲PendingIntent.getActivities()在那裏不可用。

而構建backstack從通知(通過Intent)訪問活動並使後退按鈕與應用程序一致行爲(例如詳細活動返回到列表活動)的情況也是如此。

0

活動與一個任務相關聯,該任務只是後堆棧中的一組活動。當您單擊通知後開啓新活動時,該活動將作爲獨立活動打開並投入新任務。這意味着只有通知活動和父活動存在。

只需在清單文件中將活動的啓動模式指定爲「標準」,即可解決問題。

Intent resultIntent = new Intent(getApplicationContext(), 
         ResultActivity.class); 

PendingIntent resultPendingIntent = 
    PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

mBuilder.setContentIntent(resultPendingIntent); 

NotificationManager mNotificationManager = (NotificationManager) 
    getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(notId, mBuilder.build()); 

清單:

<activity 
      android:name="com.mns.exercisenotifications.ResultActivity" 
      android:label="@string/app_name" 
      android:launchMode="standard" > <--- 
      <intent-filter> 
       <action android:name="com.mns.exercisenotifications.ResultActivity" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 

</activity> 
0

該解決方案正是針對此問題

android:noHistory="true"