スリープ中に電話をスリープ解除する唯一の方法は、AlarmManagerを使用することです。他の方法はありません(まあ、ウェイクロックを保持して電話がスリープ状態になるのを防ぐことはできますが、それは不必要にバッテリーを消耗し、ユーザーは怒ります)。
したがって、AlarmManagerを使用してアラームをスケジュールする必要があります。次に、アラームが鳴ったときに、アプリケーションがすでに実行されてログインしているかどうかを確認できます(この情報をいくつかの静的(ckass)変数として保存してください)。アプリケーションがまだ実行されておらず、ログインしていない場合は、何もしません。
編集:コード例を追加
アプリケーション内のすべてのクラスからアクセスできるパブリック静的(クラス)変数を作成します。
public class Globals {
public static boolean applicationIsBusyDoingSomethingUseful = false;
}
アプリケーションでは、何か便利なことをしていて、タイマーベースのアラームによって中断またはログアウトされたくない場合は常に、この変数を「true」に設定する必要があります。有用なものはすべて、変数を「false」にリセットする必要があります。
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...
}
}
}