緊急を要する通知を表示する

特定の状況(進行中のアラームや着信など)で、アプリでユーザーの注意を緊急に引き出すことが必要になる場合があります。Android 9(API レベル 28)以前を搭載したデバイスをターゲットとするアプリでは、アプリがバックグラウンドで動作しているときにアクティビティを起動することで、この問題に対応できます。このドキュメントでは、Android 10(API レベル 29)から Android 13(API レベル 33)を搭載したデバイスでこの動作を実現する方法について説明します。

POST_NOTIFICATIONS 権限を追加する

Android 13 以降では、次の行を AndroidManifest.xml ファイルに追加します。

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

これで、通知チャンネルを作成できます。

通知チャネルを作成する

通知チャンネルを作成して通知を適切に表示し、ユーザーがアプリの設定で通知を管理できるようにします。通知チャンネルの詳細については、通知チャンネルの作成と管理をご覧ください。

Application クラスの onCreate メソッドで通知チャンネルを作成します。

Kotlin

class DACapp : Application() {
    override fun onCreate() {
        super.onCreate()
        val channel = NotificationChannel(
            CHANNEL_ID,
            "High priority notifications",
            NotificationManager.IMPORTANCE_HIGH
        )

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
}

ユーザーがアプリを初めて実行すると、アプリの [アプリ情報] システム画面に図 1 のような内容が表示されます。

アプリの [アプリ情報]、[通知] 画面を示す画像。
図 1. アプリのシステム設定の [アプリ情報] 画面の通知セクション

通知権限の管理

Android 13 以降では、ユーザーに通知を表示する前に通知権限をリクエストします。

最小限の実装は次のようになります。

Kotlin

val permissionLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.RequestPermission(),
    onResult = { hasNotificationPermission = it }
)
...
Button(
    onClick = {
        if (!hasNotificationPermission) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
            }
        }
    },
) {
    Text(text = "Request permission")
}

Android 13 を搭載したデバイスの場合、Request permission ボタンをタップすると、図 2 に示すダイアログが表示されます。

権限リクエスト ダイアログを示す画像
図 2. 通知権限リクエスト用のシステム ダイアログ

ユーザーが権限リクエストを承認すると、アプリの [アプリ情報] セクションは図 3 のようになります。

通知権限をリクエストした後のアプリ情報画面を示す画像
図 3. 通知権限が付与されました。

高優先度通知を作成する

通知を作成するときは、わかりやすいタイトルとメッセージを含めます。

次の例には通知が含まれています。

Kotlin

private fun showNotification() {
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    val notificationBuilder =
        NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.baseline_auto_awesome_24)
            .setContentTitle("HIGH PRIORITY")
            .setContentText("Check this dog puppy video NOW!")
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setCategory(NotificationCompat.CATEGORY_RECOMMENDATION)

    notificationManager.notify(666, notificationBuilder.build())
}

通知をユーザーに表示する

showNotification() 関数を呼び出すと、次のように通知がトリガーされます。

Kotlin

Button(onClick = { showNotification() }) {
    Text(text = "Show notification")
}

この例の通知は図 4 のようになります。

優先度の高い通知の画像
図 4. 優先度の高い通知。

進行中の通知

通知をユーザーに表示するとき、ユーザーはアプリのアラートやリマインダーを確認または非表示にできます。たとえば、ユーザーは着信を許可または拒否できます。

電話の着信など、進行中の通知の場合は、その通知をフォアグラウンド サービスに関連付けます。次のコード スニペットは、フォアグラウンド サービスに関連付けられた通知を表示する方法を示しています。

Kotlin

// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification)

Java

// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification);