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