当应用程序在后台时无法从意图中获取额外信息
Cant get Extras from intent when application is in background
我尝试在单击通知时在我的 MainActivity 中执行一个函数。
该函数需要我在 intent extras 中放入的数据。
问题是当我在应用程序运行时点击通知时功能被执行,但是当我在应用程序处于后台时点击通知时,功能没有被执行。我已经检查过了,这是因为当应用程序在后台时,我放入 intent extras 的数据是空的。
我该如何解决这个问题?谢谢!
这是我收到的回复:
{
"to":"blablabla",
"notification": {
"body":"Sentiment Negative from customer",
"title":"Mokita"
},
"data" : {
"room_id":1516333
}
}
这是我的通知代码:
public void onMessageReceived(RemoteMessage message) {
super.onMessageReceived(message);
Log.d("msg", "onMessageReceived: " + message.getData().get("room_id"));
String roomId = message.getData().get("room_id");
Intent intent = new Intent(this, HomePageTabActivity.class);
intent.putExtra("fromNotification", true);
intent.putExtra("roomId", roomId);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
String channelId = "Default";
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(message.getNotification().getTitle())
.setContentText(message.getNotification().getBody())
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, "Default channel", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
manager.notify(0, builder.build());
}
}
这是 函数 以及我如何在 MainActivity 中执行它:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
onNewIntent(getIntent());
}
@Override
public void onNewIntent(Intent intent){
Bundle extras = intent.getExtras();
if(extras != null){
if(extras.containsKey("fromNotification") || extras.containsKey("roomId")) {
openChatRoom(Long.valueOf(extras.getString("roomId")));
}else if(extras.containsKey("fromNotification") && extras.containsKey("roomId")){
openChatRoom(Long.valueOf(extras.getString("roomId")));
}else{
Log.e("EXTRAS room",""+extras.getString("roomId"));
Log.e("EXTRAS STATUS",""+extras.getBoolean("fromNotification"));
}
}else{
Toast.makeText(HomePageTabActivity.this,"Empty",Toast.LENGTH_SHORT).show();
}
}
public void openChatRoom(long roomId){
Log.d("LONG ROOM",""+roomId);
QiscusRxExecutor.execute(QiscusApi.getInstance().getChatRoom(roomId),
new QiscusRxExecutor.Listener<QiscusChatRoom>() {
@Override
public void onSuccess(QiscusChatRoom qiscusChatRoom) {
startActivity(GroupRoomActivity.
generateIntent(HomePageTabActivity.this, qiscusChatRoom));
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
});
}
Receive messages in an Android app。具有通知和数据负载的消息,包括背景和前景。在这种情况下,数据有效负载被传送到启动器 activity 的附加功能。如果你想在其他 activity 上获取它,你必须在数据负载上定义 click_action。因此,在您的启动器 activity 中获得额外的意图。
这些有效负载将传送到您在待定意图中指定的 activity。因此,当用户单击您的通知时,HomePageTabActivity
将启动,您可以通过在 activity 生命周期的任何位置调用 getIntent()
来获取意图。但是因为您在 activity 上设置了 singleTop
标志,如果 HomePageTabActivity
已经启动,Android 将不会再次启动它并将新的 Intent(在通知中提供)传递给 onNewIntent()
代替。您可以在那里使用它,甚至可以调用 getIntent()
从那里获取新值。
Firebase 有两种类型的消息:通知消息和数据消息。如果想让FCM SDK自己处理消息,需要使用notification
。当应用处于非活动状态时,FCM 将使用 notification
正文来显示消息。在这种状态下,onMessageReceived
也不会被触发。如果你想让app处理消息,你需要使用data
。您可能需要更改
中的推送通知负载
{
"message":{
"token":"xxxxx:...",
"notification":{
"title":"Your title",
"body":"Your message"
}
}
}
到
{
"message":{
"token":"xxxxx:...",
"data":{
"title":"Your title",
"body":"Your message",
"fromNotification":"true",
"roomId":"123"
}
}
}
您还需要相应地处理onMessageReceived(RemoteMessage remoteMessage)
中的消息。您可以在 Notifications and data messages.
中阅读有关通知行为的信息
我尝试在单击通知时在我的 MainActivity 中执行一个函数。 该函数需要我在 intent extras 中放入的数据。
问题是当我在应用程序运行时点击通知时功能被执行,但是当我在应用程序处于后台时点击通知时,功能没有被执行。我已经检查过了,这是因为当应用程序在后台时,我放入 intent extras 的数据是空的。
我该如何解决这个问题?谢谢!
这是我收到的回复:
{
"to":"blablabla",
"notification": {
"body":"Sentiment Negative from customer",
"title":"Mokita"
},
"data" : {
"room_id":1516333
}
}
这是我的通知代码:
public void onMessageReceived(RemoteMessage message) {
super.onMessageReceived(message);
Log.d("msg", "onMessageReceived: " + message.getData().get("room_id"));
String roomId = message.getData().get("room_id");
Intent intent = new Intent(this, HomePageTabActivity.class);
intent.putExtra("fromNotification", true);
intent.putExtra("roomId", roomId);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
String channelId = "Default";
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(message.getNotification().getTitle())
.setContentText(message.getNotification().getBody())
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, "Default channel", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
manager.notify(0, builder.build());
}
}
这是 函数 以及我如何在 MainActivity 中执行它:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
onNewIntent(getIntent());
}
@Override
public void onNewIntent(Intent intent){
Bundle extras = intent.getExtras();
if(extras != null){
if(extras.containsKey("fromNotification") || extras.containsKey("roomId")) {
openChatRoom(Long.valueOf(extras.getString("roomId")));
}else if(extras.containsKey("fromNotification") && extras.containsKey("roomId")){
openChatRoom(Long.valueOf(extras.getString("roomId")));
}else{
Log.e("EXTRAS room",""+extras.getString("roomId"));
Log.e("EXTRAS STATUS",""+extras.getBoolean("fromNotification"));
}
}else{
Toast.makeText(HomePageTabActivity.this,"Empty",Toast.LENGTH_SHORT).show();
}
}
public void openChatRoom(long roomId){
Log.d("LONG ROOM",""+roomId);
QiscusRxExecutor.execute(QiscusApi.getInstance().getChatRoom(roomId),
new QiscusRxExecutor.Listener<QiscusChatRoom>() {
@Override
public void onSuccess(QiscusChatRoom qiscusChatRoom) {
startActivity(GroupRoomActivity.
generateIntent(HomePageTabActivity.this, qiscusChatRoom));
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
});
}
Receive messages in an Android app。具有通知和数据负载的消息,包括背景和前景。在这种情况下,数据有效负载被传送到启动器 activity 的附加功能。如果你想在其他 activity 上获取它,你必须在数据负载上定义 click_action。因此,在您的启动器 activity 中获得额外的意图。
这些有效负载将传送到您在待定意图中指定的 activity。因此,当用户单击您的通知时,HomePageTabActivity
将启动,您可以通过在 activity 生命周期的任何位置调用 getIntent()
来获取意图。但是因为您在 activity 上设置了 singleTop
标志,如果 HomePageTabActivity
已经启动,Android 将不会再次启动它并将新的 Intent(在通知中提供)传递给 onNewIntent()
代替。您可以在那里使用它,甚至可以调用 getIntent()
从那里获取新值。
Firebase 有两种类型的消息:通知消息和数据消息。如果想让FCM SDK自己处理消息,需要使用notification
。当应用处于非活动状态时,FCM 将使用 notification
正文来显示消息。在这种状态下,onMessageReceived
也不会被触发。如果你想让app处理消息,你需要使用data
。您可能需要更改
{
"message":{
"token":"xxxxx:...",
"notification":{
"title":"Your title",
"body":"Your message"
}
}
}
到
{
"message":{
"token":"xxxxx:...",
"data":{
"title":"Your title",
"body":"Your message",
"fromNotification":"true",
"roomId":"123"
}
}
}
您还需要相应地处理onMessageReceived(RemoteMessage remoteMessage)
中的消息。您可以在 Notifications and data messages.