【Android】【Java】通知をタップしたときの特定の処理の実行方法

こんにちは、kazuです。
Androidアプリの開発を進める中で、「通知をタップした際に、単純な画面遷移ではなく、特定の処理を行いたい!」という疑問を抱えたことはありませんか?
この記事では、その疑問に答える形で、通知をタップしたときの特定の処理の実行方法について、Javaを中心に解説していきます。

前提条件

前提条件としては通知の処理がすでに入っていることとします。
つまり以下の画像のように通知が表示できるようにするということにします。

そしてこの通知をタップすると特定の処理(今回はトーストを表示)させるという対応をします。
また言語はJavaです。Kotlinでも書き方は違うかもしれませんが、考え方は同じになります。
本当は通知表示の処理も解説したいのですが、処理が多すぎまして。。。

実際にコードを見てみよう

private static final String CHANNEL_ID = "channelId";
private static final String CHANNEL_NAME = "channelName";
private static final String CONTENT_TITLE = "contentTitle";
private static final String CONTENT_TEXT = "contentText";
private static final String APP_NAME = "appName";
public static Notification build(Context context) {
    ・・・ 一部処理を抜粋 ・・・
       // Receiverへ遷移するIntent処理を定義
    Intent notificationIntent = new Intent(context, NotificationReceiver.class);
       // Broadcastを定義
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      return new Notification.Builder(context, CHANNEL_ID)
         .setAutoCancel(true)  // タップした時に通知が消えるか
           .setContentIntent(pendingIntent)  // クリック時のReceiverへ通知
           .setContentTitle(CONTENT_TITLE)  // 通知タイトル
           .setContentText(CONTENT_TEXT)  // 通知テキスト
           .setSmallIcon(R.drawable.image) // 画像の表示
           .setTicker(APP_NAME)  // アプリ名の表示
           .setWhen(System.currentTimeMillis())  //タイムスタンプ
           .build();
      }
}
public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 通知がタップされたときの処理
        Toast.makeText(context, "通知がタップされました!", Toast.LENGTH_SHORT).show();
    }
}
<receiver android:name=".NotificationReceiver"/>

ちょっと解説

まずはbuild()が実行されて通知を表示されます。
そして表示された後は実際にタップ処理を行っているのは setContentIntent(pendingIntent) です。
この処理によりIntentによりBradcastを受信します。そしてそのonReceiveの中の処理を実行します。
でもこれってActivityで直接呼ぶ処理をしたい時ってどうすればいいの?
っていうこともあるかもしれません。一つの案として次に記載するとします。

Activity処理を実行したい時

public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 通知がタップされたときの処理
        // TmpActivityを開く
        Intent intent = new Intent(context, TmpActivity.class);
        // フラグを追加する
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent)
    }
}
public class TmpActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ---- Activityでしたい処理を実行 ---- //
        // 処理が完了したらアクティビティを終了
        finish();
    }
}

追加の解説

やっていることとしては、先ほどのトースト部分の処理をTmpActivityを開いてそのActivityの中で処理を実行しています。
そして処理が終了したらActivityを閉じるという動きです。これで対応できます。

最後に

いかがでしたでしょうか?
通知をタップした際の反応をカスタマイズすることで、アプリのユーザーエクスペリエンスをより柔軟にコントロールできることをお伝えしました。
画面遷移だけでなく、特定の処理を実行する方法を取り入れることで、アプリがさらに便利で魅力的になることでしょう。
今回の内容が、あなたの開発のお役に立てれば幸いです。アプリ開発、頑張ってくださいね!

次のステップ

この記事を見て次のステップを記載しておきます。
必ずしも本記事と同じ処理になっているとは限らないですが、ステップとして以下のように切り分けて進めるのがいいと思います。
1.まずはタップ処理を探す。(本記事では setContentIntent(pendingIntent) になります。)
2.そのタップ処理はどこの処理から呼ばれているか
3.どういう処理を実行したいか。(ただ画面を開きたいのか処理だけ実行したいのか)
ここまで来れば後は試行錯誤するだけになります。
この記事が参考になることを願います。最後までご覧いただきありがとうございました。