私は通知を表示する必要があるアプリに取り組んでいます。通知には、FireBase Cloud Messaging (FCM)を使用しています。アプリがバックグラウンドにあるときに通知を受け取ることができます。
しかし、通知をクリックすると、home.Javaページにリダイレクトされます。 Notification.Javaページにリダイレクトさせたい。
そのため、通知のクリック時にアクティビティを指定する方法を教えてください。私は2つのサービスを使用しています:
1。)MyFirebaseMessagingService
2。)MyFirebaseInstanceIDService
これは、MyFirebaseMessagingServiceクラスのonMessageReceived()メソッドのコードサンプルです。
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "FirebaseMessageService";
Bitmap bitmap;
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
}
/**
* Create and show a simple notification containing the received FCM message.
*/
private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
Intent intent = new Intent(this, Notification.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Notification", TrueOrFalse);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setLargeIcon(image)/*Notification icon image*/
.setContentTitle(messageBody)
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(image))/*Notification with Image*/
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
/*
*To get a Bitmap image from the URL received
* */
public Bitmap getBitmapfromUrl(String imageUrl) {
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
FCMでは、2つの メッセージのタイプ をクライアントに送信できます:
1。通知メッセージ:「表示メッセージ」と見なされることもあります。
FCMは、クライアントアプリに代わってメッセージをエンドユーザーデバイスに自動的に表示します。通知メッセージには、ユーザーが表示できるキーの定義済みセットがあります。
2。クライアントアプリによって処理されるデータメッセージ:.
クライアントアプリは、データメッセージの処理を担当します。データメッセージには、カスタムキーと値のペアのみがあります。
FCMドキュメントによると Androidアプリ
- アプリがバックグラウンドにあるときに配信される通知。この場合、通知はデバイスのシステムトレイに配信されます。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます。
- 通知とデータペイロードの両方、バックグラウンドとフォアグラウンドの両方を持つメッセージ。この場合、通知は
デバイスのシステムトレイ。データペイロードは、ランチャーアクティビティのインテントの追加で配信されます。
Set click_action
通知ペイロード内:
したがって、バックグラウンドで到着したメッセージを処理する場合は、click_action
メッセージ付き。
click_action
は 通知ペイロードのパラメーター
アプリを開いて特定のアクションを実行する場合は、click_action
を通知ペイロードに追加し、起動するアクティビティのインテントフィルターにマップします。
たとえば、click_action
からOPEN_ACTIVITY_1
次のようなインテントフィルターをトリガーします。
<intent-filter>
<action Android:name="OPEN_ACTIVITY_1" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
FCMペイロードは次のようになります。
{
"to":"some_device_token",
"content_available": true,
"notification": {
"title": "hello",
"body": "test message",
"click_action": "OPEN_ACTIVITY_1"
},
"data": {
"extra":"juice"
}
}
アプリがバックグラウンドにある場合、ランチャーアクティビティでインテントを配信する必要があります。したがって、ランチャーアクティビティが開きます。次に、ランチャーアクティビティのIntentにデータがあるかどうかを確認し、必要なアクティビティを開始します。
AndroidManifest.xml
<activity Android:name="YOUR_ACTIVITY">
<intent-filter>
<action Android:name="com.example.yourapplication_YOUR_NOTIFICATION_NAME" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
FirebaseMessagingService.JavaファイルのonMessageReceivedメソッド:
public void onMessageReceived(RemoteMessage remoteMessage){
String title=remoteMessage.getNotification().getTitle();
String message=remoteMessage.getNotification().getBody();
String click_action=remoteMessage.getNotification().getClickAction();
Intent intent=new Intent(click_action);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this);
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(message);
notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
notificationBuilder.setAutoCancel(true);
notificationBuilder.setContentIntent(pendingIntent);
NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
通知用のクラウド機能/サーバーコード:
notification: {
title: "TITLE OF NOTIFICATION",
body: "NOTIFICATION MESSAGE",
sound: "default",
click_action: "com.example.myapplication_YOUR_NOTIFICATION_NAME"
}
Open MyFirebaseMessagingService.Java file
そのファイル内にはsendNotification()メソッドがあり、以下に示すようにインテントでナビゲートする必要があるアクティビティを指定する必要があります
Intent intent = new Intent(this, YourActivityName.class);
複数の通知を送信していて、特定の通知をクリックすると異なるアクティビティに移動したい場合は、任意の条件ステートメントを使用してそれを達成できます。以下に示すように、switch caseを使用することをお勧めします
private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
Intent intent = new Intent();
switch(condition) {
case '1': intent = new Intent(this, ActivityOne.class);
break;
case '2': intent = new Intent(this, ActivityTwo.class);
break;
case '3': intent = new Intent(this, ActivityThree.class);
break;
default : intent = new Intent(this, DefaultActivity.class);
break;
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Notification", TrueOrFalse);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
}
このロジックを使用して、FCMの通知クリックで特定のアクティビティを開くことができます。これは私にとって完璧に機能します。ありがとう