2010-02-09 58 views
63

在Android中,我定義了一個活動ExampleActivity。如何將活動引入前景(堆棧頂部)?

當我的應用程序啓動時,這個A活動的一個實例被創建,說它是A。 當用戶點擊A中的一個按鈕時,B-Activity的另一個實例B被創建。現在任務堆棧是B-A,B在頂部。然後,用戶點擊B上的一個按鈕,C-Activity的另一個實例,並創建了C。現在任務堆棧是C-B-A,C在頂部。

現在,當用戶單擊C上的一個按鈕時,我希望應用程序將A帶到前臺,即使A成爲任務堆棧A-C-B的頂部。

我該如何編寫代碼才能實現它?

回答

80

你可以試試這個FLAG_ACTIVITY_REORDER_TO_FRONT(文檔描述要什麼)

+3

我覺得應該是[FLAG_ACTIVITY_SINGLE_TOP(http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP)。 – 2012-05-17 11:18:44

+19

@ user942821'FLAG_ACTIVITY_SINGLE_TOP'在這裏沒有幫助。當ActivityC位於堆棧的頂部並且它調用'startActivity()'來啓動ActivityA時,即使您設置了「FLAG_ACTIVITY_SINGLE_TOP」,它仍然會創建一個ActivityA的**新實例**。如果您嘗試啓動已經位於堆棧頂部的活動**,則「FLAG_ACTIVITY_SINGLE_TOP」只會阻止創建新實例**。在這種情況下,ActivityA不在棧頂,所以Android創建一個新的實例。 – 2013-03-21 10:34:34

+4

太棒了!使用'(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)'在給定的'活動'後清除任何歷史記錄。 – shkschneider 2015-06-09 15:48:14

4

我認爲Intent標誌的組合應該可以做到。特別是,Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

在致電startActvity之前,將這些標誌添加到您的意圖中。

1

一般來說,我認爲不推薦這種活動管理方法。重新激活活動中兩個步驟的問題是,該活動可能已被殺死。我的建議是到記住你的活動的情況,並startActivity()

發動他們,我敢肯定,你已經看到了這個頁面,但爲your convenience this link

48

我發現這樣做的最好方式是使用與Android主屏幕使用的相同意圖 - 應用程序啓動器。

例如:

Intent i = new Intent(this, MyMainActivity.class); 
i.setAction(Intent.ACTION_MAIN); 
i.addCategory(Intent.CATEGORY_LAUNCHER); 
startActivity(i); 

這樣一來,我的包中任何活性最近使用的用戶再次帶回前。我發現這在使用我的服務的PendingIntent將用戶帶回我的應用程序中很有用。

+0

非常感謝那段代碼。我浪費了幾個小時試圖讓它正常工作。 – Emilio 2011-11-14 14:59:46

+2

或沒有ComponentName和setComponent,但與新的意圖(這,MyMainActivity.class) – Tima 2011-11-17 16:28:40

+0

我猜2010年的文檔和標準稀疏,這不是正確的答案。 – ashishduh 2014-08-07 21:47:25

17

這裏是你如何能做到這一個代碼,例如:

Intent intent = getIntent(getApplicationContext(), A.class) 

這將確保你只在堆棧上活動的一個實例。

private static Intent getIntent(Context context, Class<?> cls) { 
    Intent intent = new Intent(context, cls); 
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    return intent; 
} 
3

FLAG_ACTIVITY_REORDER_TO_FRONT: 如果傳遞給Context.startActivity()的意圖設置,該標誌將導致啓動的活動被帶到其任務的歷史堆棧的前方,如果它已經在運行。

Intent i = new Intent(context, AActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
startActivity(i); 
-1

如果您使用「Google Cloud Message」通過「PendingIntent」類接收推送通知,則以下代碼僅在操作欄中顯示通知。

單擊通知將不會創建任何活動,最後一個活動活動將恢復,從而保持當前狀態而不會出現問題。

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

的Ciao!

1

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

注意你的homeactivity launchmode應single_task

0

如果你想在一個通知,當點擊帶來的活動堆棧的頂部,那麼你可能需要做以下,使FLAG_ACTIVITY_REORDER_TO_FRONT工作:

我的解決方案是讓廣播接收機偵聽通知觸發的廣播操作。所以基本上:

  1. 通知觸發一個廣播操作與一個額外的啓動活動的名稱。

  2. 廣播接收機捕獲此被點擊的通知時,然後創建的意圖使用FLAG_ACTIVITY_REORDER_TO_FRONT標誌

  3. 活性被帶到活動堆棧,沒有重複的頂部,以啓動該活性。