[解決済み] AlarmManagerで設定したAlarmClockのアラームを、時計アプリで正しくキャンセルする方法を教えてください。
質問内容
この質問にはすでに回答があります こちら , こちら そして こちら . しかし、それらはOPで動作確認されておらず、私の場合、同じPendingIntentで設定したアラームがキャンセルされないのです。 AlarmClockのアラームをキャンセルする方法はありますか?
@Override
protected void onHandleIntent(@Nullable Intent i) {
Intent i = new Intent(AlarmClock.ACTION_SET_ALARM);
i.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
i.putExtra(AlarmClock.EXTRA_HOUR, 6);
i.putExtra(AlarmClock.EXTRA_MINUTES, 0);
i.putExtra(AlarmClock.EXTRA_MESSAGE, "Good Morning");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
PendingIntent alarmIntent = PendingIntent.getActivity(
this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(),
alarmIntent);
Log.d(TAG, "Alarm set");
try {
Thread.sleep(15000);
alarmMgr.cancel(alarmIntent);
Log.i(TAG, "Alarm canceled");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
このコードは期待通りに出力されます。
Alarm set
Alarm canceled
しかし、設定されているアラームを解除することはできません。何が間違っているのでしょうか?
解決方法を教えてください。
ということで、必要なことがわかりました。
使用
ACTION_DISMISS_ALARM
の代わりに
ACTION_SET_ALARM
. 目覚まし時計にすでに設定されているアラームをキャンセルすることができます。
回答 ここで , こちら そして こちら はPendingIntentをキャンセルすることを提案しましたが、私にはうまくいきませんでしたし、質問者にもうまくいくことが確認されていません。
AlarmManagerからPendingIntentをキャンセルしてもうまくいかない理由は、PendingIntentは後で何かをしたり、インテントを送ったりするためにある、ということが考えられると思います。一度やってしまったこと(すでにインテントを送ってしまったこと)は、元に戻すことはできません。例えば、通知をキャンセルすることはできても、通知からアプリを開くこと(実行したインテントやアクション)は、すでに実行されているので、取り消すことはできないのです。しかも、私の場合、アラームの設定を解除する必要があったのは別のアプリだったので、そのアクションを元に戻せると思ってはいけなかったかもしれません。
ですから、アラームを解除したり取り消したりするためには、次のようなアクションを持つ新しいインテントを送信する必要があります。
ACTION_DISMISS_ALARM
.
try/catchブロックを以下のように置き換えると、私の場合、アラームの設定とキャンセルが正しく行われます。
try {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
return;
}
Thread.sleep(15000);
Intent ci = new Intent(AlarmClock.ACTION_DISMISS_ALARM);
ci.setData(i.getData());
alarmIntent = PendingIntent.getActivity(this, 0, ci, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(),
alarmIntent);
Log.i(TAG, "Alarm cancelled");
} catch (InterruptedException e) {
e.printStackTrace();
}
ただし、これはAPIレベル23以上の場合のみ有効です。
のようにSKIP_UIすることができません。
ACTION_SET_ALARM
.
関連
-
[解決済み】コンテンツには、id属性が「android.R.id.list」であるListViewが必要です。
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み】Androidエミュレータのエラーメッセージ。"PANIC: Missing emulator engine program for 'x86' CPUS." (パニック: エミュレータ・エンジン・プログラムがありません)
-
[解決済み】起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりませんでした
-
[解決済み】Bluestackの向きを変更する : ポートレート/ランドスケープモード
-
[解決済み】android.content.res.Resources$NotFoundExceptionの取得:androidにリソースが存在する場合でも例外が発生する。
-
[解決済み] 複数のデバイスを接続しているときにADB Shellを使用するには?error: more than one device and emulator "で失敗します。
-
[解決済み] Androidでイメージビューの背景を透明に設定する
-
[解決済み] AndroidでBluetoothが有効かどうかのチェックに失敗する(REQUEST_ENABLE_BTを変数に解決できない)。
-
[解決済み] Android Fragment onAttach() 非推奨
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studioでパラメータ化されたユニットテストを実行すると、指定されたインクルードに対するテストが見つからないエラーが発生する
-
[解決済み】Android: Intent エラーを処理するアクティビティは見つかりませんでしたか?どのように解決するのか
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み】Android Studioでマニフェストのマージに失敗し、複数のエラーが発生した。
-
[解決済み】'dependencies' を '(groovy.lang.Closure)' に適用できない。)
-
[解決済み] AndroidのADBデバイスが不正に
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] Xlint:deprecationを使用して再コンパイルする方法
-
[解決済み] Android: @drawable/picture を drawable に変換するのに失敗しました。