2012-03-07 24 views
40

讓我們試着解釋我的問題: 我得到了一個應用程序和一個服務。 啓動應用程序與活動A. 服務發送一個廣播,可以讓應用程序啓動活動B 現在用戶開始活動C.Android:我如何避免已經在堆棧中的開始活動?

現在服務要重新開始b活動。但是,我怎麼讓他知道這項活動仍然在籌備中,或者是否存在這樣的意圖標誌?

如何避免它將啓動活動B,因爲它已經在堆棧中?

+0

什麼是d到底是什麼?它是你寫的代碼嗎?如果是這樣,答案很簡單,**不**調用'StartActivity(B)'。 – 2012-03-07 08:58:40

+0

對不起,我重寫了我的問題:) – 2012-03-07 09:02:24

回答

55

我認爲你需要讓你的活動B singleInstance,如果它已經創造你不想再創造,這是launch mode of the activity可以在清單android:launchMode定義,定義如何活動將被實例化

在你的情況下使用

android:launchMode="singleInstance"

+1

工作正常! :)謝謝 – 2012-03-07 09:25:01

+2

但是,如果我將launchMode設置爲singleInstance,我將無法正確獲取onActivityResult回調。 – DevAndroid 2015-09-04 12:22:38

+1

它解決了我的問題.. – 2015-10-15 05:21:17

21

您可以使用標記Intent.FLAG_ACTIVITY_NEW_TASK。如果活動已經在運行,它會將其放在前面,而不是創建新的活動。

如果您添加Intent.FLAG_ACTIVITY_CLEAR_TOP與此,那麼在此活動後在堆棧中的所有活動將被清除。

+2

這是exaclty我不想發生的事情。如果已經開始活動的活動。它不應該被覆蓋。 – 2012-03-07 09:11:26

+1

這不會覆蓋該活動。它只會帶來已經開始的活動。 – 2012-03-07 09:23:48

+2

Intent.FLAG_ACTIVITY_NEW_TASK不適用於我..這總是開始新的活動.. 請幫我出來 – 2014-08-08 06:08:27

5

如果活動將是,如果已經開始了頂部,設置FLAG_ACTIVITY_SINGLE_TOP標誌

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
mContext.startActivity(intent); 
+0

這在使用側欄/抽屜時特別有用,並且您不希望在前面打開兩次活動。 – dermatthias 2015-12-17 15:54:44

+0

我開始使用Intent.FLAG_ACTIVITY_SINGLE_TOP從一個服務的活動,該活動不會啓動,我得到此錯誤: android.util.AndroidRuntimeException:從活動上下文外調用startActivity()需要FLAG_ACTIVITY_NEW_TASK標誌。這真的是你想要的嗎? – yeahman 2016-03-10 18:36:09

2

途徑android:launchMode="singleInstance",只是添加標誌到Intent不爲我工作。 什麼工作是:

在代碼中獲取活動開始:

Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
startActivity(intent); 

ActivityThatHasToBeStarted

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
     finish(); 
     return; 
    } 
    // Code for this creation 
} 
1

如果您不需要第二個活動了,這是件好事練習完成它,那麼你應該在手術結束後的第二次活動上做到這一點:

startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
finish(); 
0

我建議您使用Intent.FLAG_ACTIVITY_CLEAR_TOP,因爲它會移除所有在您的目標活動之上開始的活動。

如:

Intent intent = new Intent(sourceActivity, Target activity); 

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

startActivity(intent)