2012-06-11 24 views
0

我需要那個android應用程序做一些特定的時間螞蟻的一天,例如在下午8:00應用程序應該註銷。我不想使用AlarmManager,因爲即使應用程序未運行,它也會啓動。如果電話重新啓動關閉的計劃分散器,也是如此。與Runnable的Handler將是非常好的,但如果手機入睡,它不起作用。 所以,我需要的是:運行任務週期性,但有一些例外

  • 應用做一些事情在指定的時間(保存在偏好)
  • 這應該只有在應用程序運行時發生並記錄在(中睡着了,甚至電話)

    你能提出什麼建議?

編輯:
這個任務也應該等待,直到應用程序結束的其他工作(發送,接收數據),甚至更好,如果只在特定的活動執行(如家庭或主要在那裏的其他工作不執行)

+0

奇怪的請求,你可能想要添加更多你正在嘗試做的事情,因爲恐怕這仍然像是一個AlarmManager的工作。您可以使用啓動意圖重置警報,以便異議無效。你的建議存在的問題是你需要一些像警報管理員那樣的服務,但不是那種警報管理員。聽起來像是更多的努力,然後它是值得的。也許使用管理器,但檢查應用程序是否正在運行? – Nanne

回答

0

睡眠時喚醒手機的唯一方法是使用AlarmManager。沒有其他的方式(好吧,你可以保持喚醒鎖,並防止手機進入睡眠狀態,但這會不必要地耗盡電池,用戶會生氣)。

所以你想使用AlarmManager安排一個警報。然後,當警報關閉時,您可以檢查自己是否應用程序已在運行並已登錄(保存此信息是一些靜態(ckass)變量)。如果應用程序尚未運行並已登錄,則無需執行任何操作。

編輯:添加代碼示例

創建可由所有類的應用程序中訪問的公共靜態(類)變量:

public class Globals { 
    public static boolean applicationIsBusyDoingSomethingUseful = false; 
} 

在您的應用程序,只要它是做一些有用的事情,不想被基於計時器的警報中斷或註銷,它應該將此變量設置爲「true」,並且當它完成其工作並且不再有用時,它應該重置變量到「假」:

public void someUsefulWork() { 
    // set flag while doing useful work 
    Globals.applicationIsBusyDoingSomethingUseful = true; 
    // do useful work 
    // ... 
    // end of useful work 
    Globals.applicationIsBusyDoingSomethingUseful = false; 
} 

在您的BroadcastReceiver中,當鬧鐘響起時,您可以檢查應用程序是否有用。如果是這樣,你只需忽略警報並等待下一個警報。如果它沒有做任何有用的事情,則將用戶登出。

public class MyAlarmReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
     // Check if application is doing anything useful 
     if (Globals.applicationIsBusyDoingSomethingUseful) { 
      // Application is busy working, so ignore this alarm 
     } else { 
      // Log the user out or whatever... 
     } 
    } 
} 
+0

好吧,我可以檢查應用程序是否在鬧鐘響起後登錄,但是如果當時完成了其他一些工作,我該如何延遲登出 – Armuras

+0

對不起,我不明白這個問題。例如: –

+0

:BroadcastReceiver在manifest.xml上註冊。當前應用程序將數據發送到服務器。警報被解僱。現在BroadcastReceiver已打開。它檢查用戶現在是否登錄了應用程序。因爲它是應用程序應該註銷它。但只有當前任務(發送數據到服務器)結束。如何從BroadcastReceiver檢查應用程序正在做什麼? 如果我在activity-onResume()中註冊BroadcastReceiver並在activity-onPause()中取消註冊,那麼我可能會錯過應用程序應該註銷用戶。如何從BroadcastReceiver確定哪個活動處於前臺? – Armuras