我正在尝试通过FCM控制台生成通知,但我收到了这些通知,但我无法覆盖FirebaseMessagingService的onMessageReceived
。不知道我做错了什么。
MyFirebaseMessagingService 类:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "FROM:" + remoteMessage.getFrom());
//Check if the message contains data
if(remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data: " + remoteMessage.getData());
}
//Check if the message contains notification
if(remoteMessage.getNotification() != null) {
Log.d(TAG, "Mesage body:" + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody(),remoteMessage.getData());
}
}
/**
* Dispay the notification
* @param body
*/
private void sendNotification(String body , Map<String,String> data) {
// int finalSecId = Integer.parseInt((String) data.get("sec_id"));
// int sec = Integer.parseInt((String) data.get("sec"));
Intent intent = new Intent(this, InsuranceActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0/*Request code*/, intent, PendingIntent.FLAG_ONE_SHOT);
//Set sound of notification
Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notifiBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.login_meter)
.setContentTitle(getString(R.string.app_name))
.setContentText((String) data.get("sec_id")+ " "+(String) data.get("sec"))
.setAutoCancel(true)
.setSound(notificationSound)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /*ID of notification*/, notifiBuilder.build());
}
}
内部应用程序标记
<service android:name=".Fcm.MyFirebaseMessagingService"
android:enabled="true"
android:exported="true"
>
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service android:name=".Fcm.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
答案 0 :(得分:2)
有两种类型的FCM
通知消息:仅当您的应用处于前台时,使用此消息类型发送有效内容才会触发onMessageReceived()。
数据消息:仅使用此特定消息类型发送有效负载会触发onMessageReceived(),无论您的应用是否位于前台/后台。
参考:here
答案 1 :(得分:1)
我遇到了处理来自FCM的通知的问题。
首先,我们必须了解有两种类型的通知。
通知 - 当您的应用不在前台并生成通知时,它会触发。如果您点击它,它将打开启动器活动。
数据通知 - 这个用于解析数据,它在后台和前台接收。因此,您可以根据FCM推送在数据对象中提供的数据构建自定义通知。
Map<String ,String> dataMap = remoteMessage.getData();
这里我创建了一个带键值对的简单Map。现在,我可以在数据对象中收到通知的标题,并使用自定义意图进行简单通知。
我个人使用上下文对象来确定应用程序是在前台还是后台。基于此我决定是否必须显示通知或仅更新数据。
希望这有帮助。
答案 2 :(得分:1)
扩展#Sudip Podder评论和#Ratilal Chopda答案 请按照以下步骤操作:
<强>步骤1:强>
<activity android:name=".SplashActivity">
<intent-filter>
<action android:name=".SplashActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<强>步骤2:强>
我在服务器上使用php,因此您需要按照自己喜欢的方式调整内容,但在通知有效负载中添加"click_action" : ".SplashActivity"
$fields = array(
'to' => $token,
'notification' => array(
'title' => 'Motors City',
'body' => $message,
"click_action" => ".AppSplash",
),
'data' => array(
'sec_id' => $secID,
'sec' => $sec,
'extra1'=>$extra1,
'extra2'=>$extra2
)
);
$headers = array(
'Authorization:key=' . $server_key,
'Content-Type:application/json'
);
<强>步骤3:强>
在您的SplashActivity
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
Log.d(TAG,bundle.toString);
}}
你完成了
答案 3 :(得分:0)
现在您在通知类型中有通知,触发通知默认,只需点击通知即可打开应用。
因此,您需要将服务器端代码从通知类型更改为数据类型。 并尝试从
获取消息`remoteMessage.getData()` not from `remoteMessage.getNotification()`
如果您想管理点击通知使用数据类型通知。要了解有关此类型的更多信息,请通过此链接 https://firebase.google.com/docs/cloud-messaging/concept-options
答案 4 :(得分:-1)
试试这个
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);