スマートフォンアプリ作成

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版

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 で受信する必要がある。

<receiver android:name=".AlarmReceiver”>
    <intent-filter>
        <action android:name="android.media.action.DISPLAY_NOTIFICATION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

androidには Applicationクラスが存在し継承もできるが、アプリのステータス管理程度しかできない。

iOSの UIApplicationDelegate のようなアプリ全体をみれるような仕組みがないのである。

そのため、アラームを受信するのでさえアプリごとに別プロセスとしてレシーバをメモリ常駐させなければ実現できない。

内部メモリがiOSの4倍も必要になるのもうなづける。

2018年11月
    123
45678910
11121314151617
18192021222324
252627282930 
android
iOS
アプリの著作権
ブロックチェーン/暗号技術
日本のなりたち

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版
スマートフォンアプリ作成