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で実行日時などを設定する
アラームの実行タイミングは以下のように使い分けることができます。
- 一定時間後に実行する
- 指定時刻に実行する
- 一定時間ごとに繰り返し実行する
アラームは、ユーザーの操作以外をトリガーに出来る手段ですので、ぜひ覚えておきましょう。

