2010-03-05 38 views
31

恢復的活動我有我的應用程序狀態欄的通知:從通知

Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis()); 

    Intent notificationIntent = new Intent(this.parent, MainActivity.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0); 

    ... 

    notification.flags = Notification.FLAG_ONGOING_EVENT;   
    mNotificationManager.notify(NOTIFICATION_ID, notification); 

這樣做的問題是,當你從App按home鍵(它推到後臺)然後按下從狀態欄訪問的列表中的通知,它會啓動活動的全新副本。我想要做的就是恢復應用程序(就像當你長按主頁按鈕並按下應用程序的圖標時)。有沒有創建一個意圖來做到這一點?

+0

檢查:http://stackoverflow.com/questions/3305088/how-to-make-notification-intent-resume-rather-than-making-a- new-intent/39482464#39482464 – TharakaNirmana 2016-09-14 07:52:09

回答

30

我已經解決了這個問題,通過將我的活動的launchMode更改爲androidManifest.xml文件中的singleTask

此屬性的默認值爲standard,它允許運行任意數量的實例。

「singleTask」和「singleInstance」活動只能開始一項任務。它們始終處於活動堆棧的根部。而且,該設備一次只能保存一個活動實例 - 只有一個這樣的任務。 [...]

「singleTask」和「singleInstance」模式在一個方面也各不相同:「singleTask」活動允許其他活動成爲其任務的一部分。它始終是其任務的根源,但其他活動(必然是「標準」活動和「單一活動」)可以啓動到該任務中。另一方面,「單一實例」活動不允許其他活動成爲其任務的一部分。這是該任務中唯一的活動。如果它啓動另一個活動,那麼該活動將分配給其他任務 - 就好像FLAG_ACTIVITY_NEW_TASK在意圖中一樣。

,你可以找到在Android Developers' Guide

我希望這有助於

+1

謝謝,這真棒 – 2014-07-07 15:20:44

+1

也看看'''android:launchMode =「singleTop」''',這可能也適合並列在「正常啓動」下。 – 2015-11-05 17:11:56

+0

使用任何(singleTask,singleTop,singleInstance),我發現活動任務堆棧被打破,任務堆棧清除了所有其他活動 – Ninja 2017-02-21 03:38:59

-1

我用:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
notificationIntent.setAction(Intent.ACTION_MAIN); 

不知道這些都是你需要設置的值,但得到的答覆是在這些方法中/標誌。

+0

我試過了上面的但它不起作用,你能給出一個完整的通知示例嗎? – 2015-08-08 21:32:56

+0

@EnesBattal對不起,我不再有可用的代碼(對我的應用程序採取了不同的方式)。意圖標誌的事情是一個大混亂。我不認爲我真的知道了。 – gnobal 2015-08-09 04:36:18

1

我剛剛找到了解決這個問題:我創建getPreviousIntent方法,並給它的PendingIntent that`s所有:

private Intent getPreviousIntent(Intent newIntent) { 
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0); 
    String myPkgNm = getPackageName(); 

    if (!recentTaskInfos.isEmpty()) { 
     ActivityManager.RecentTaskInfo recentTaskInfo; 
     for (int i = 0; i < recentTaskInfos.size(); i++) { 
      recentTaskInfo = recentTaskInfos.get(i); 
      if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) { 
       newIntent = recentTaskInfo.baseIntent; 
       newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      } 
     } 
    } 
    return newIntent; 
} 
+0

我們如何才能將它賦予待定意圖?你可以請分享代碼 – yrahman 2015-08-11 17:55:39

+0

這裏ti解決http://stackoverflow.com/questions/31448840/android-how-to-open-last-activity-when-tapping-notification – nAkhmedov 2015-08-13 05:32:46

1

我有一個類似的問題,正確的方法處理這個是使用標誌:Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP像這樣

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

從文檔這一意志:

FLAG_ACTIVITY_CLEAR_TOP

如果設置,並且正在啓動已經在當前任務運行的活動,那麼,而不啓動該活動的一個新的實例,都在它上面的其他活動的將被關閉,這個意圖將作爲一個新的Intent被傳遞給(現在在頂部)舊的活動。

FLAG_ACTIVITY_SINGLE_TOP

如果設置,活動將不被它是否已經在歷史堆棧的頂部運行啓動。

1

將此行添加到應用的清單文件中的相應活動。

android:launchMode="singleTask" 

如:

<activity 
    android:name=".Main_Activity" 
    android:label="@string/title_main_activity" 
    android:theme="@style/AppTheme.NoActionBar" 
    android:launchMode="singleTask" />