1

這是我有:AlarmManager沒有啓動活動(如果存在)

Intent intent = new Intent(); 
intent.setClass(context,SomeActivity.class); 
PendingIntent pending = PendingIntent.getActivity(context,requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, someDistantMillis, someIntervalInMillis,pending); 

它的工作原理確定,那就是活動在someDistantMillis推出後someIntervalInMillis

一再推出的唯一的問題是,如果SomeActivity已經在someIntervalInMillis之後運行,則在堆棧頂部啓動另一個SomeActivity實例。

下面是簡要我想達到的目標:

  1. Strart,AlarmManager
  2. 如果SomeActivity實例已經然後運行轉到4),否則,轉至3)
  3. 啓動SomeActivity,結束
  4. 什麼都不做,結束

任何想法應該怎麼做,o r Intent包含哪些標誌(FLAG_ACTIVITY_SINGLE_TOP似乎不起作用)?

+0

嘗試在manifest中的activity標籤中添加'android:launchMode =「singleInstance」''。 –

+0

SomeActivity是您的應用程序的根活動(ACTION = MAIN和CATEGORY = LAUNCHER)嗎? –

+0

@PankajKumar請不要建議'launchMode =「singleInstance」'而不要先獲取大量其他數據。使用此啓動模式可能會解決此特定問題,但可能會爲用戶創建大量其他問題。通常,singleInstance啓動模式只能用於非常特殊的情況(例如:HOME屏幕替換)。恕我直言,這是不好的建議。 –

回答

2

創建您Activity靜態boolean成員字段:

public static boolean running = false; 

onStart()方法設置runningtrueonStop()false。然後,在您要確定您的Activity正在運行的地方,只是這樣做if聲明:

if(SomeActivity.running) { 
    // go to step 4 
} else { 
    // go to step 3 
} 

static關鍵字在這裏至關重要,因爲它意味着running領域將是常見的SomeActivity類的所有實例,因此你不需要訪問特定的SomeActivity的對象。

+0

好主意,如果沒有什麼比這更好的coms會走的話。有更多的「Android方法」來處理這個問題嗎?我不喜歡依賴一些靜態變量的想法。 – aldorain

+0

請注意,當您在應用程序之間切換然後嘗試重新啓動特定應用程序時,系統知道是從後臺恢復活動還是啓動一個新的應用程序,因此必須有一些較低級別的邏輯從SDK處理此問題 – aldorain