Androidアプリ開発でプッシュ通知を学ぶ者

Androidアプリ、、、学んでおります。。。
最近はAIのチカラもあって新しい言語で何かを作るハードルは格段に下がりました。
0から言語特有の構文を学ぶより、AIで生成してもらったソースをチューニングすることにより、
ぐっと作業時間は減ったことを実感しています。

しかし!

ある程度理解してないと、一向にそれ以上のスピードが出ないため、
アプリ開発の傍ら斧得ておこうと思った事項をまとめていこうと思います。

今回は「プッシュ通知」

スポンサーリンク

ソースコード全文

package com.example.notification1

import android.Manifest
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.app.NotificationCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        //通知許可をリクエスト
        val requestCode = 1001 //適当なリクエストコード
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS)
                != PackageManager.PERMISSION_GRANTED
            ) {
                requestPermissions(
                    arrayOf(Manifest.permission.POST_NOTIFICATIONS),
                    requestCode
                )
            }
        }

        val channelId = "channnelId"
        val channel = NotificationChannel(
            channelId,
            "通知名テスト1",
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = "xxx通知名テスト1の説明xxx"
            enableVibration(true)         //バイブレーション有無
        }

        val manager = getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)

        val builder = NotificationCompat.Builder(this, channelId)
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setContentTitle("通知時のタイトル")
            .setContentText("通知内容の説明文")

        manager.notify(1, builder.build())   // ← これで通知が出る!

    }
}

※アプリ名は「notification1」

必要なソースコードの個別説明

MainActivity.kt

必要なimport文

//通知関連
import android.app.NotificationChannel
import android.app.NotificationManager

//通知許可リクエスト関連
import android.content.pm.PackageManager
import android.os.Build
import android.Manifest

//通知実行関連
import androidx.core.app.NotificationCompat

実装部分(通知許可のリクエスト)

        //通知許可をリクエスト
        val requestCode = 1001 //適当なリクエストコード
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS)
                != PackageManager.PERMISSION_GRANTED
            ) {
                requestPermissions(
                    arrayOf(Manifest.permission.POST_NOTIFICATIONS),
                    requestCode
                )
            }
        }

実装部分(通知設定)

        val channelId = "channnelId"
        val channel = NotificationChannel(
            channelId,
            "通知名テスト1",
            NotificationManager.IMPORTANCE_DEFAULT
        ).apply {
            description = "xxx通知名テスト1の説明xxx"
            enableVibration(true)         //バイブレーション有無
        }

        val manager = getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)

NotificationChannelの第二引数は左画像のように通知チャンネル名となり、apply内の設定は通知設定内の詳細を指定する。

実装部分(テスト通知を飛ばす)

        val builder = NotificationCompat.Builder(this, channelId)
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setContentTitle("通知時のタイトル")
            .setContentText("通知内容の説明文")

        manager.notify(1, builder.build())

通知が表示されるとsetContentTitle、setContentTextで指定したテキストが通知情報として表示される。

※通知許可のリクエストの関係で、初回インストール時に通知テストを実行することができない。
そのため一度アプリを起動⇒終了⇒起動とすることで意向確認することができるようになる。

もっと楽できそうだけど面倒だったので妥協。。。

AndroidManifest.xml

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

NotificationChannnelの引数について

項目名説明
idチャンネルID、アプリ内でユニークにする
name通知設定画面上の通知名
importance通知重要度、ポップアップやバイブレーションの有無に関係する

importanceについて

通知に関する初期設定を行う。
初回のインストールで設定した内容はアプリを再ビルドする際に書き換えることはできない(※何度かハマった。。)

項目名説明
IMPORTANCE_NONE一切通知がされない状態
IMPORTANCE_MIN・サイレント通知として表示されるようになる
・通知音やバイブ無し
IMPORTANCE_LOWステータスバーに通知が表示されるようになる
・通知音、バイブ無し
IMPORTANCE_DEFAULT・ステータスバーに通知が表示される
・通知がサイレントでなくなる
・通知音、バイブが有効になる
IMPORTANCE_HIGH・ステータスバーに通知が表示される
・通知がサイレントでなくなる
・通知音、バイブが有効になる
・ポップアップで表示される

以下はapplyでdescriptionとsetShowBadgeだけ設定し、IMPORTANCE_~だけ変えてどうなるかを確認。

IMPORTANCE_NONE

全ての通知がされない状態

IMPORTANCE_MIN

サイレント通知される状態。
下記のように通知状態を確認すれば通知が発生していたことを確認可能。

IMPORTANCE_LOW

サイレント通知されることに変わりはないものの、
下記のようにステータスバーに通知が残る状態。

IMPORTANCE_DEFAULT

IMPORTANCE_HIGH

applyの説明

あまりこだわりがないので自分で使うものだけ最低限抜粋

項目名デフォルト値内容
description空(表示なし)各通知チャネルで表示される説明テキスト
enableVibration(bool)falseバイブレーション有無
※falseにしてもバイブすることがあり、アプリ以外の設定とも関係してるかも?
その場合trueにしたときバイブパターンが異なる。

descriptionを指定すれば「アプリ情報⇒通知」画面の上部に説明が掲載され、
バイブレーションを有効にすればトグルがONになる。

FAQ

通知許可のリクエストが発生しない

⇒AndroidManifest.xmlに<uses-permission>が追加できていない

NotificationChannelのIMPORTANCE_~~が上書きできない

⇒初期設定項目となるため、一度インストールした後は上書きできない
 変更しようとするなら第一引数のidを新規で用意するか、再インストールする必要アリ

ソース全文をコピペしたが通知が出ない

⇒通知の許可リクエストの関係で、初回実行時に通知が出ない
そのため一度許可リクエストで許可を出した後、一度アプリを閉じて再度実行すれば通知が出る。

まとめ

多分通知を出すソースを準備するより、この記事を書く時間の方が圧倒的に長かった。
※馴染みのない言語なので致し方なしですが。。。

スポンサーリンク
おすすめの記事