Android
 Computer >> コンピューター >  >> プログラミング >> Android

KotlinでAndroidアプリにAlarmManagerを実装する方法を徹底解説

KotlinでAlarmManagerを実装する方法

この記事では、Kotlinを使用してAndroidアプリにAlarmManager(アラームマネージャー)を実装する方法を、実際に動作するサンプルコードとともに段階的に解説します。TimePickerで指定した時刻にアラームをセットし、毎日繰り返し処理を実行する仕組みを構築していきます。

ステップ1:新しいプロジェクトを作成する

Android Studioを開き、メニューから「File」→「New Project」を選択して、必要な項目をすべて入力し、新しいプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。時刻を選択するためのTimePickerと、アラームを設定するためのButtonを配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="2dp"
    tools:context=".MainActivity">
    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />
    <Button
        android:id="@+id/buttonAlarm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/timePicker"
        android:layout_centerInParent="true"
        android:layout_marginTop="10dp"
        android:text="Set Alarm" />
</RelativeLayout>

ステップ3:MainActivity.kt を編集する

src/MainActivity.kt に以下のコードを追加します。TimePickerで選択された時刻をもとにCalendarオブジェクトを生成し、AlarmManagerに毎日繰り返すアラームを登録しています。

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TimePicker
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*
class MainActivity : AppCompatActivity() {
    lateinit var btnSetAlarm: Button
    lateinit var timePicker: TimePicker
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        timePicker = findViewById(R.id.timePicker)
        btnSetAlarm = findViewById(R.id.buttonAlarm)
        btnSetAlarm.setOnClickListener {
            val calendar: Calendar = Calendar.getInstance()
            if (Build.VERSION.SDK_INT >= 23) {
                calendar.set(
                    calendar.get(Calendar.YEAR),
                    calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH),
                    timePicker.hour,
                    timePicker.minute,
                    0
                )
            } else {
                calendar.set(
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH),
                timePicker.currentHour,
                timePicker.currentMinute, 0
                )
            }
            setAlarm(calendar.timeInMillis)
        }
    }
    private fun setAlarm(timeInMillis: Long) {
        val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent(this, MyAlarm::class.java)
        val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0)
        alarmManager.setRepeating(
            AlarmManager.RTC,
            timeInMillis,
            AlarmManager.INTERVAL_DAY,
            pendingIntent
        )
        Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show()
    }
    private class MyAlarm : BroadcastReceiver() {
        override fun onReceive(
            context: Context,
            intent: Intent
        ) {
            Log.d("Alarm Bell", "Alarm just fired")
        }
    }
}

補足ポイント:Android 12(API 31)以降では、PendingIntentを作成する際に PendingIntent.FLAG_IMMUTABLE または PendingIntent.FLAG_MUTABLE のフラグ指定が必須となっています。最新のOSで動作させる場合は、該当箇所を次のように書き換えてください。

val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)

また、setRepeating()はAPI 19以降、バッテリー最適化のため正確な間隔ではなく概算間隔で動作することに注意してください。厳密な時刻に発火させたい場合は、setExactAndAllowWhileIdle()などのメソッドの利用を検討しましょう。

ステップ4:AndroidManifest.xml を編集する

androidManifest.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行してみよう

それでは、アプリケーションを実際に実行してみましょう。ここでは、実機のAndroidスマートフォンがパソコンに接続されているものとして説明を進めます。Android Studioからアプリを実行するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーにある「Run」アイコンKotlinでAndroidアプリにAlarmManagerを実装する方法を徹底解説をクリックします。表示された選択肢から自分のモバイルデバイスを選択すると、スマートフォンの画面にアプリが起動します。

KotlinでAndroidアプリにAlarmManagerを実装する方法を徹底解説

  1. AndroidアプリにPull-to-Refresh(スワイプ更新)を実装する方法をわかりやすく解説

    AndroidのPull-to-Refreshとは? Androidにおける「Pull-to-Refresh」(プルトゥリフレッシュ)は、「Swipe-to-Refresh(スワイプで更新)」とも呼ばれるUIパターンです。画面を上から下へスワイプすると、setOnRefreshListenerに登録した処理が実行され、リストやコンテンツの再読み込みなどを行うことができます。GmailやTwitterなど、多くの定番アプリでも採用されている直感的な操作です。 本記事では、AndroidのSwipeRefreshLayoutを使って、Pull-to-Refresh機能を実装する手順を具体的なコード

  2. 【Android開発】AlarmManagerでアラームを設定する方法をKotlinで解説

    AndroidのAlarmManagerとは? Androidアプリ開発において、指定した時刻に処理を実行したいケースは多くあります。例えば、通知の送信や定期処理の実行などです。そんなときに活躍するのがAlarmManager(アラームマネージャー)です。AlarmManagerを使うことで、アプリが動作していなくても、指定した時刻にシステムが処理を起動してくれます。 この記事では、TimePickerで選択した時刻にアラームを設定するサンプルアプリを通じて、AlarmManagerの基本的な使い方をKotlinで解説します。 手順1:新規プロジェクトを作成する まず、Android Stu