指定時刻や定期的に実行するアラームの実装方法【Androidアプリ開発】

AlarmManagerを利用して、アラーム機能を実装する方法を説明しています。

この方法により、指定日時や一定時間経過後、一定時間ごとなどユーザーの操作以外で処理を行うことが出来ます

アラームの概要

アラーム機能を実装する場合、以下のような手順が必要です。

  1. ブロードキャストを受診できるようにする
    • BroadcastReceiverを継承したクラスを作成する
    • AndroidManifestにreceiverを追加する
  2. 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を利用して、アラーム機能を実装する方法を説明しました。

アラームを実行するには、ブロードキャストの受信を行うための設定も必要となります。

具体的には、以下の手順です。

  1. ブロードキャストを受診できるようにする
    • BroadcastReceiverを継承したクラスを作成する
    • AndroidManifestにreceiverを追加する
  2. AlarmManagerで実行日時などを設定する

アラームの実行タイミングは以下のように使い分けることができます。

  • 一定時間後に実行する
  • 指定時刻に実行する
  • 一定時間ごとに繰り返し実行する

アラームは、ユーザーの操作以外をトリガーに出来る手段ですので、ぜひ覚えておきましょう。

参考

ブロードキャストの概要|Android Developers

反復アラームのスケジュール設定|Android Developers

学習方法

Javaの基礎を学ぶ

Androidアプリ開発では、JavaやKotlinが用いられます。
いきなりAndroidアプリ開発を学習するのは難しいので、Javaの基礎から学習しておくと理解しやすくなります。

既に、Javaの学習経験・開発経験がある方は必要ありませんが、Java言語を使ったことがないという方は、Javaの基礎から学習することをオススメします。

また、Kotlinに関しては、Javaを簡略したような書き方となっています。Javaの基礎知識がないと学習が難しいですが、Javaの基礎知識があれば、ご自身で調べながら学習することも十分に可能です。

 

独学が難しいと思ったら…

プログラミングスクールを活用してみても良いでしょう。
通常のプログラミングスクールは、数十万円の費用が掛かる場合があり、中々手が出しづらいですが、サブスク型のプログラミングスクールも存在しています。
サブスク型と言っても、通常のプログラミングスクールと同じように、現役エンジニアによるサポートも付いています。
最も安い基本的なコースで、月額1万円ほどとなっており、他のプログラミングスクールよりも初期費用が安いため、気軽に始められます。

Androidアプリ開発を学ぶ

Javaの基礎知識があったとしても、Androidアプリ独特の仕組みがあるため、とっつきづらいです。

Javaでの開発経験があれば、問題を解決しながら学習することも可能です。しかし、(当サイト含め)ネットでの情報は断片的に解説されていることも多く、流れで理解するのは難しいかしれません。

ご自身で調べながら学習することが難しいと感じたら、市販の参考書を活用すると良いでしょう。参考書では、Androidアプリ開発というテーマに沿って、1冊内で解説していく流れとなっていますので、入門書として活用すると理解がしやすくなります。

Kotlin版

Java版

 

Androidアプリ開発
この記事を書いた人

エンジニアとして仕事をしています。
仕事や趣味を通して、開発やプログラミングについて学んだことを綴っていきます。
 ・実務経験は、WEBシステムのサーバーサイドコーディングがメイン
 ・アプリ開発は趣味程度

akihiro-takedaをフォローする
akihiro-takedaをフォローする
プログラミング・開発の備忘録
タイトルとURLをコピーしました