4

毎週繰り返されるアラームをいくつか設定して、ユーザーがクラス(アカデミックアプリ)にいるときに電話を自動的に振動させ、クラスが終了すると音量をリセットする必要があります。

すでにアラームを作成していますが、ユーザーがこの機能を無効にした場合は、すべてのアラームを非アクティブ化する方法が必要です。また、AlarmManager.cancel()メソッドに同じパラメーターを渡してインテントすることでこれを行う必要があることもわかっていますが、ここでの問題は次のとおりです。

ユーザーはクラスをキャンセルしてクラスに登録できます(ただし、アプリに直接登録することはできません)。これは更新されてDBに反映され、現在のクラスのみが保持されます。それで、もう存在しないクラスへのアラーム設定がある場合、PendingIntentを複製できない場合、どうすればそれをキャンセルできますか?

ここで見た解決策の1つは、現在のアラームを追跡するdbテーブルを作成することです。そうすれば、それらを完全に制御できます。別の方法は、クラスリストが更新されたときにすべてのアラームをキャンセルしてリセットすることですが、そうすることにはかなりの時間がかかります。時間の長さ、そして3番目の、しかしあまり親しみのないオプションは、ユーザーが電話を起動するのを待つことです。アラームをリセットするときは、必要なものを設定するだけです(この起動動作が間違っている場合は修正してください)。私が試すべき4番目のオプションはありますか、それとも十分であればこれらの1つですか?

4

1 に答える 1

4

まず、複数のアラームを設定する必要はありません。NEXT アラームを設定し、そのアラームが鳴ったら、新しい次のアラームを設定するだけです。これにより、アラームが1つしかないため、電話が再起動された場合にアラームが失われたときに、アラームを簡単に再設定することもできます.

私はこの小さなルーティーンを使ってアラームを設定しています。パラメータの値によってSet、アラームを設定するかキャンセルするかが決まります。

public static void SetMyAlarm(Context c, long AlarmTime, Boolean Set) {
    Intent intent = new Intent(c, AlarmReceiver.class); // The broadcast receiver that will handle my alarm 

    int UniqueID =8192; // id for this specific alarm, use a different id for each separate alarm

    PendingIntent sender = PendingIntent.getBroadcast(c, UniqueID, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager am = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
    if (Set) {
        am.set(AlarmManager.RTC_WAKEUP, AlarmTime, sender);
    } else {
        am.cancel(sender);
    }
}
于 2012-05-02T14:31:48.983 に答える