我正在使用firebase-cloud-messaging
向我的应用程序推送通知。我希望当用户单击通知时,它会打开OpenWeb类和一个Intent打开url。
使用 PHP 发送的数据:
$data = array("notification"=> array("title"=>"http://example.com/",
"text"=>"This is a test msg!",
"click_action"=>"OpenWeb"),
"priority" => "high",
"to"=>"/topics/main");
MyFirebaseMessagingService.java
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String title = remoteMessage.getNotification().getTitle();
String body = remoteMessage.getNotification().getBody();
String click_action = remoteMessage.getNotification().getClickAction();
Context context = getApplicationContext();
Intent intent = new Intent(click_action);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("link",title);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 , intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.notification)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.notification))
.setContentTitle("Notification")
.setContentText(body)
.setSound(defaultSoundUri)
.setAutoCancel(true)
.setContentIntent(contentIntent);
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 , notificationBuilder.build());
}
开放网络.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getIntent.getStringExtra("link"));
startActivity(intent);
}
安卓清单.xml
<activity android:name=".OpenWeb">
<intent-filter>
<action android:name="OpenWeb" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
当我单击通知时,活动开始,getIntent.getStringExtra("link")
OpenWeb
为空。这意味着MyFirebaseMessagingService类不会将数据发送到活动。
我应该怎么做才能在OpenWeb
上发送数据?
好吧,代码存在一些问题 1. 在您的 PHP 脚本中,您没有指定任何"body"
但您仍在调用String body = remoteMessage.getNotification().getBody();
这是一个 Null 指针异常。
2.此click_action键仅在应用程序处于前台时有效,对于应用程序处于后台并关闭的所有其他情况,它不起作用。
3.您需要设置标志才能启动新活动,以便intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
因此,如果触发待处理意图,由于原因 2,您最终会得到 NPE,现在您可以通过发送数据消息而不是 Firebase SDK 来处理您的通知来解决此问题,然后走廊就会被NONNULL
好的Firebase有两种类型的消息
- 推送消息由 Firebase SDK 处理,即您设置了标题和正文以及其他因素但无法发送自定义数据的消息
不过,数据按摩必须是键值对。
例如,您希望发送一些数据以及客户端应用程序将处理的通知,例如,您正在发送一些有关体育比赛的新闻,以便您可以创建一个 JSON 格式的节点,上面写着
data: {
coolNews: "Some Cool News1",
coolNews2: "Some really cool news2"
}
然后你可以打电话给remoteMessage.getData().get("coolNews");
但是要小心,因为如果您发送以下 JSON
Notification:{
to: //UserToken ,
title: "Some Title",
body: "Some body",
data: {
coolNews: "Some Cool News1",
coolNews2: "Some really cool news2"
}}
只有在客户端打开通知后,才会管理数据有效负载,但是,如果您将整个通知 json 作为数据有效负载发送,并且您在客户端处理所有内容,则会同时接收所有通知。 如下所示:
Notification:{
to: //UserToken
data: {
title: "Some Title",
body: "Some body",
coolNews: "Some Cool News1",
coolNews2: "Some really cool news2"
}}
然后在您的FirebaseMessageId
中,您可以调用remotemessage.getData().get("title");
标题,并为所有其他标题(例如body
和coolNews
)调用相同的标题。
现在,对于BroadCast recevier
,您可以通过firebasemessagingId
发送广播,如下所示:
Intent intent = new Intent(this, NotificationBR.class);
Bundle bundle = new Bundle();
bundle.putDouble("key1",remoteMessage.getData().get("title"));
bundle.putDouble("key2",remoteMessage.getData().get("coolNews1"));
......
intent.putExtras(bundle);
sendBroadcast(intent);
并发起broadcast class
和
DONT FORGET TO ADD TO YOUR MANIFEST!
像这样的东西...
public class NotificationBR extends BroadCastReciever {
@Override
public void onReceive(Context ctx, Intent intent){
if(intent.getExtras() != null){
String key1 = intent.getStringExtra("key1");
......
}
//Then you can use intent to send it to whichever activity you want
Intent sendToActivity = new Intent(ctx, Activity.class);
sendToActivity.putExtras(someBundle) //Containing your strings you want to pass to activity, you can also use sendToActivity.putStringExtra("Some values")
startActivity(sendToActivity);
仅此而已.
对错别字感到抱歉。.