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

継続的なアラームや着信など、特定の状況では、アプリでユーザーの注意を早急に引き付けることが必要になる場合があります。Android 9(API レベル 28)以前を搭載したデバイスでは、アプリがバックグラウンドにある間にアクティビティを起動することで、この処理を行うことができます。このドキュメントでは、Android 10(API レベル 29)以降を搭載したデバイスでこの動作を実現する方法について説明します。

POST_NOTIFICATIONS 権限を追加する

Android 13(API レベル 33)以降では、AndroidManifest.xml ファイルで POST_NOTIFICATIONS 権限を宣言します。

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

権限を宣言したら、通知チャンネルを作成します。

通知チャンネルを作成する

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

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

class MyApplication : 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 以降では、ユーザーに通知を表示する前に通知権限をリクエストします。

次のコード例は、Jetpack Compose で実行時の通知権限をリクエストする方法を示しています。

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 以降を搭載したデバイスで [権限をリクエスト] ボタンをタップすると、図 2 に示すシステム ダイアログが表示されます。

ユーザーに通知を許可するよう求めるシステム ダイアログ。
図 2. 通知権限のリクエストのシステム ダイアログ。

ユーザーが権限を付与すると、図 3 に示すように、システムが [アプリ情報] 画面を更新します。

通知権限が付与されていることを示す [アプリ情報] 画面。
図 3. 通知権限が付与されました。

高優先度通知を作成する

高優先度通知を作成する場合は、わかりやすいタイトルとメッセージ テキストを指定します。重要度の高いチャネルと優先度も割り当てます。

次のコード例では、高優先度通知を構成してビルドします。

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(0, notificationBuilder.build())
}

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

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

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

図 4 は、システムによって表示される優先度の高い通知を示しています。

デバイスに表示される優先度の高い通知。
図 4. 高優先度通知。

進行中の通知

ユーザーに通知が表示されたとき、ユーザーはアプリのアラートまたはリマインダーについて承認もしくは却下を選択できます。たとえば、ユーザーは電話の着信に応答するか拒否するかを選択できます。

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

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

ライブ情報の使用を検討する

時間的制約のある進行中の通知は、可視性を高めることでメリットが得られます。進行中の通知をライブ情報としてプロモートし、システム UI サーフェス全体にステータス情報を表示することを検討してください。