0

Android アプリケーションが 1 日の特定の時間に何かを実行する必要があります。たとえば、午後 8 時にアプリケーションがログアウトする必要があります。アプリケーションが実行されていなくてもAlarmManagerが起動するため、 AlarmManagerを使用したくありません。また、オフになっているスケジュール ディスパーサーの電話が再起動された場合。Runnable を使用したハンドラーは非常に優れていますが、電話がスリープ状態になると機能しません。だから私が必要なのは:

  • アプリケーションは指定された時間に何かを行います (設定に保存されます)

  • これは、アプリケーションが実行されていてログインしている場合にのみ発生します (電話がスリープ状態であっても)。

    何を提案できますか?

EDITED:
また、このタスクは、アプリケーションが他の作業(データの送信、受信)を終了するまで待機する必要があります。特定のアクティビティ(他の作業が実行されていないホームやメインなど)でのみ実行する場合はさらに良いでしょう

4

1 に答える 1

0

スリープ中に電話をスリープ解除する唯一の方法は、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...
        }
    }
}
于 2012-06-11T14:57:57.413 に答える