2012-01-18 110 views
17

我在帶有圖標的應用程序上有一個通用菜單。點擊一個圖標將開始一個活動。有沒有辦法知道一個活動是否已經在運行,並防止它多次(或從多個條目)啓動?我也可以將處於onPause狀態的活動帶到前面嗎?防止多次打開活動

+0

我沒有做過Android開發在一段時間內,但我敢肯定,Android會調出你的'Activity'的現有實例,而不是啓動一個新的實例。 – 2012-01-18 07:16:23

回答

30

使用此:

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

同時開始Activity

documentation

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

14

在清單文件的活動宣言,​​添加標籤android:launchMode="singleInstance"

+0

從startActivityForResult的文檔中,如果您正在啓動的活動使用singleTask啓動模式,它將不會在您的任務中運行,因此您將立即收到取消結果。 – 2013-08-03 06:27:42

+0

我有多個入口點,這對我很有用 – 2015-07-09 11:44:21

+0

事實上,我不是「singleInstance」的粉絲,因爲它會導致活動在單獨的窗口中運行,就好像它是一個單獨的應用程序,用戶打開應用程序視圖時的用戶體驗。 – 2017-04-09 08:08:25

0

創建活動,你不想開始多次像

Class ExampleA extends Activity { 
public static Activity classAinstance = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    classAinstance = this; 
} 

} 

現在在以往任何時候ü要的實例crosscheck我的意思是防止它啓動多次,像這樣檢查

if(ExampleA.classAinstance == null) { 
     "Then only start your activity" 
} 
+1

請注意,這樣可以防止垃圾收集活動。此外,如果Activity是從其他不能訪問(甚至不知道)靜態活動引用的其他組件(例如,另一個應用程序)啓動的,則這將無濟於事。 – lxgr 2015-06-08 15:54:51

0

Add給你的Activity定義Androidmanifest.xml ...

android:launchMode = "singleInstance" 
0

只需使用

Intent i = new Intent(ActivityA.this, ActivityB.class); 
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i); 
-1

添加此

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    finish(); 
} 

launchmode到singleTask /單模

總是通過清除棧

+2

請給你的答案添加一些解釋。 – ItamarG3 2017-05-19 12:21:48

+0

**來自複審隊列:**我可以請求您在請求答案時添加更多的上下文。僅有代碼的答案很難理解。如果您可以在帖子中添加更多信息,它可以幫助提問者和未來的讀者。 – 2017-05-19 17:46:37

2

我把它做以下工作完全打開新的活動。 在(甚至是從其他應用程序)

Intent launchIntent = getPackageManager().getLaunchIntentForPackage(APP_PACKAGE_NAME); 

//the previous line can be replaced by the normal Intent that has the activity name Intent launchIntent = new Intent(ActivityA.this, ActivityB.class); 

     launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_NEW_TASK); 

startActivity(launchIntent); 

,並在接收器的工作的清單呼叫者活動或服務(我想阻止開放兩次)

<activity android:name=".MainActivity" 
      android:launchMode="singleTask" 
      >