アンドロイドアプリ開発でそこそこ確実なアラームをセットするのにWeb上でよく見かけるコード、
alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTimeMillis, null), pendingIntent);
ですが、Andoroid8 のクイックアクセスに表示されるアラームの設定日時をタップするとシステムUIが停止してしまいます。
私が使用している端末は HUAWEI Mate9 で AndroidOS は8.0.0なのですが、このクイックアクセスに設定日時が表示される実装がされておらず、気が付くまで時間が掛かってしまいました。
こんな時は公式ドキュメント、という訳で下を見てみると
AlarmManager.AlarmClockInfo | API reference | Android Developers
AlarmManager.AlarmClockInfo(alarmTimeMillis, null) の null のところに showIntent と書いて有りました。
ああ、なるほどここで設定画面を呼び出すようになっているのか、という事で修正したのが下のコード。
Intent intent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Intent intent3 = new Intent(getApplicationContext(), MainActivity.class);
PendingIntent pending3 = PendingIntent.getActivity(getApplicationContext(), 0, intent3, 0);
// アラームをセットする
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
if (am != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
am.setAlarmClock(new AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(), pending3), pending);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending);
} else {
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending);
}
}
ただそもそもステータスバーに時計マークが出るのが気になる方がいらっしゃるようで、
他の方法(下のコード)をテスト中です。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending);
// 以下省略
こちらの方法では時計のマークは表示されず、端末の状態によって10分程度通知のずれが生じる場合が有るらしいのですが省電力にも貢献するらしいですし、実際にしばらく運用してみて大きな問題が無ければ採用を検討してみようかと考えています。
追記:2018年6月29日現在、やはり早かったり遅かったり安定しないようなのでオプションとして採用する事にしました。1分早い事が有ったり数時間遅れで通知が来たり、そうかと思うと正しく通知されたりと、確実さは無い様なので非推奨のオプションとしました。
私の他にも嵌まってしまった方の助けになればと思いアップしてみました。






コメント