AlarmManagerを利用して、アラーム機能を実装する方法を説明しています。
この方法により、指定日時や一定時間経過後、一定時間ごとなどユーザーの操作以外で処理を行うことが出来ます
アラームの概要
アラーム機能を実装する場合、以下のような手順が必要です。
- ブロードキャストを受診できるようにする
- BroadcastReceiverを継承したクラスを作成する
- AndroidManifestにreceiverを追加する
- AlarmManagerで実行日時などを設定する
アラームは、アプリを閉じていても実行されるようにブロードキャストを受信して処理を行います。
実装例
レイアウト
activity_main.xml
メインアクテビティのレイアウトです。
ボタンを押すとアラームを実行して、テキストを表示するようにします。
実装方法
AndroidManifest.xml
applicationタグの直下にreceiverタグを追加します。
ブロードキャストを受信するための設定で、これがないとアラームによる処理が実行されないため、忘れず設定しましょう。
<application> <!-- 省略 --> <receiver android:name=".AlarmReceiver" android:process=":remote" /> </application>
AlarmReceiver.kt
ブロードキャストを受信すると、onReceiveが実行されるので、overrideして処理を加えます。
class AlarmReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val toast = Toast.makeText(context, "アラームによる処理が実行されました。", Toast.LENGTH_SHORT) toast.show() } }
MainActivity.kt
ここでのポイントは以下2つです。
- AlarmManager
アラーム処理を管理する役割 - PendingIntent
実行するクラスを管理する役割
alarmMgrに実行時間や実行する処理を設定しています。
アラームをセットする処理には、この後説明する処理を書き加えてください。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //アラームを設定するボタン val buttonAlarm: Button = findViewById(R.id.buttonAlarm) buttonAlarm.setOnClickListener { //実行するクラスを指定 val alarmMgr: AlarmManager = this.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmIntent: PendingIntent = Intent(this, AlarmReceiver::class.java).let { intent -> PendingIntent.getBroadcast(this, 0, intent, 0) } //アラームをセット //ここにこの後説明する処理を加える } } }
一定時間後にアラームを実行
以下の例では、5秒後に一度だけアラームを実行するようになっています。
alarmMgr.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5 * 1000, alarmIntent )
一定時間ごとにアラームを実行
以下の例では、5秒後から10秒間隔でアラームを実行するようにしています。
alarmMgr.setInexactRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5 * 1000, 10 * 1000, alarmIntent )
指定時刻にアラームを実行
以下の例では、16時にアラームを実行して、それ以降は1日間隔で実行されるようになっています。
//起動する時間を指定(16時) val calendar: Calendar = Calendar.getInstance().apply { timeInMillis = System.currentTimeMillis() set(Calendar.HOUR_OF_DAY, 16) } //指定時間(16時)にアラームを実行、以降は1日間隔 alarmMgr.setInexactRepeating( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, alarmIntent )
実行結果
アプリ起動時
ボタンを押してアラームを実行します。
ボタンを押したとき
5秒後、画面下部にトーストが表示されました。
正常にアラーム処理が行えたことが分かります。
まとめ
AlarmManagerを利用して、アラーム機能を実装する方法を説明しました。
アラームを実行するには、ブロードキャストの受信を行うための設定も必要となります。
具体的には、以下の手順です。
- ブロードキャストを受診できるようにする
- BroadcastReceiverを継承したクラスを作成する
- AndroidManifestにreceiverを追加する
- AlarmManagerで実行日時などを設定する
アラームの実行タイミングは以下のように使い分けることができます。
- 一定時間後に実行する
- 指定時刻に実行する
- 一定時間ごとに繰り返し実行する
アラームは、ユーザーの操作以外をトリガーに出来る手段ですので、ぜひ覚えておきましょう。