Broadcastreceiver に設定したアラームを削除したい。これが実行方法です:
user_state フィールドを含む GCM メッセージを受け取りました。
user_state が 0 の場合、通知はトリガーされません user_state が 1 の場合、通知がトリガーされます user_state が 2 の場合、アラームが設定され、通知は 20 分後にトリガーされます。
これはすべてうまくいきます。
ここで、GCM インテントから受信したデータに応じて、特定のアラームを削除したいと考えています。残念ながら、AlarmManager.cancel() は Extra フィールドを比較しません。また、intent.setType("比較するデータ") を使用しようとしましたが、このフィールドを設定するとブロードキャストが受信されません...
Action フィールドで比較する必要がある Data を使用して、新しい BroadcastReceiver を登録しようとしました。私が理解しているように、これは正常に機能するはずですが、BroadcastReceiver 内から BroadcastReceiver を登録することはできません。
また、AlarmManager から Pendingintents のリストを取得することはできません。今できることは、すべてのアラームを削除することだけです。これはオプションではありません。
私が持っている他の唯一のアイデアは、AlarmManagerの代わりに独自のサービスを使用することです...私はそれを避けたいと思います。ビルトインオプションがある場合、余分なリソースを使用したくありません。
これが私の設定したアラーム方法です:
private void setTimed(Intent intent, Notify notify) {
Bundle bundle = intent.getExtras();
bundle.remove("userstate");
bundle.putString("userstate", "3");
Intent ringintent = new Intent("de.pluetzner.waveobserver.TRECEIVE");
ringintent.setType(notify.getHost()+"&&&"+notify.getService());
ringintent.putExtras(bundle);
AlarmManager am = (AlarmManager) this.context.getSystemService(this.context.ALARM_SERVICE);
PendingIntent pi = PendingIntent.getBroadcast(this.context, 0, ringintent, 0);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (this.waittime * 60 * 1000), pi);
Log.d("timer", "time set");
}
ringintent.setType() はアラームの識別子である必要がありますが、機能しません。これがないと、アラームが受信されます
これはアラームを削除する方法です。
private void deleteAlarm(Intent intent, Notify notify) {
Intent ringintent = new Intent("de.pluetzner.waveobserver.TRECEIVE");
ringintent.setType(notify.getHost() + "&&&" + notify.getService());
PendingIntent pi = PendingIntent.getBroadcast(this.context, 0, ringintent, 0);
AlarmManager am = (AlarmManager) this.context.getSystemService(this.context.ALARM_SERVICE);
am.cancel(pi);
Log.d("timer", "time removed");
}
ここでも同じです - setType が設定されていると機能しません。それがないと、すべてのアラームが削除されます。
私はまた、それがsetTypeのどういうわけか乱用になることも知っていますが、私はアイデアがありません。あなたがいずれかを持っている?