iOSとandroidにおけるAlarmの実装方法の違い
アラーム(警報)という仕組みは、目覚し時計に代表されるように、何としても相手に気づかせたい場合に用いられるものだ。
スマホアプリでアラームを使うときも、鳴ったり鳴らなかったりでは困るわけで、必ず所定の時間になったら警報を発令してほしいのだ。
iOS
iOSではアラームはローカル通知という仕組みを使って実装する。
UIApplication#scheduleLocalNotification を呼べば毎日同じ時間にアラームを鳴らすことができる。
アラームを繰り返しリピートすることもできる。
UIApplicationDelegate#didReceiveLocalNotification でローカル通知を受信する。
iOSではアプリが起動中にローカル通知を受信しても通知表示されないので、アプリでUIViewController#presentViewController でViewを表示したりサウンドを鳴らす必要がある。
android
androidではSDKバージョンによってメソッドが異なる。
いづれも、アプリが起動していてもしていなくても通知表示をしてくれる。
・SDK 23以上
AlarmManager#setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP
・SDK 19以上
AlarmManager#setExact(AlarmManager.RTC_WAKEUP
↑このメソッドでは android6以上ではスタンバイ状態でアラームが鳴らない。
・SDK 18以下
AlarmManager#set(AlarmManager.RTC_WAKEUP
適切なメッソドを使用しないと、スタンバイ状態でアラームが鳴らなかったりする。
また、androidではiOSとは異なることが3つある。
1) 次の事象が発生するとアラームが自動キャンセルされる。
・アプリが異常終了した
・端末が再起動した
2) アラームのキャンセルが ID指定できない。
iOSでは、UIApplication#cancelLocalNotification によって任意のラベル文字列を指定して該当するローカル通知をキャンセルできる。
androidでは、アラームを作成したときと同じPendingIntentを作成して AlarmManager#cancelに渡す必要がある。
3) 繰り返しリピート設定ができない。
SDK上はリピートするメソッドが用意されているが、これを使うと平気で数分遅れてアラームが鳴ってしまうので、実質的には使用できない。
そのため、アラームを受信したら翌日のアラームを再設定するという実装が必要になる。
androidのフレームワークには不備が多いが、これも最たるものだ。
アラームを受信するには次のようにレシーバを定義して BroadcastReceiver#onReceive で受信する必要がある。
androidには Applicationクラスが存在し継承もできるが、アプリのステータス管理程度しかできない。
iOSの UIApplicationDelegate のようなアプリ全体をみれるような仕組みがないのである。
そのため、アラームを受信するのでさえアプリごとに別プロセスとしてレシーバをメモリ常駐させなければ実現できない。
内部メモリがiOSの4倍も必要になるのもうなづける。
2023年12月 | ||||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
  |   |   |   |   | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |   |   |   |   |   |   |
iOS
web
アプリの著作権
ブロックチェーン/暗号技術
新しい社会
禅・大乗仏教
日本のなりたち