我希望在收到通知时自动打开应用程序,Firebase和新的FCM通知是否可以实现?
我知道我可以设置click_action,但这只是为了自定义通知点击会启动哪些活动,我需要在收到通知时自动启动的内容 .
我尝试了快速启动消息传递firebase示例,并且有一个onMessageReceived()方法,但只有在应用程序位于前台时它才有效 . 应用程序在后台运行时是否会执行某些操作? GCM可以通过直接启动广播接收器的活动意图来做我喜欢的事情,广播接收器在收到通知时调用 .
要通过FCM自动打开应用程序,您需要使用 data-message ,它保证始终调用 FirebaseMessagingService.onMessageReceived() 方法 .
data-message
FirebaseMessagingService.onMessageReceived()
然后,您可以在 .onMessageReceived() 方法中添加逻辑以启动首选活动 .
.onMessageReceived()
WARNING: 在没有任何用户交互的情况下启动UI对于大多数应用程序来说是非常糟糕的做法!请在这里阅读MarkG答案:How to start an Activity from a Service?
[...]中断用户当前正在做的事情被认为是糟糕的设计形式,尤其是那些应该在后台运行的东西 . 因此,当用户决定调查时,您应该考虑使用通知[...]启动所需的活动 . [...]
FCM与GCM的工作方式类似,可以接收两种类型的消息:
display-messages:有效载荷 {"notification" : { "body" : "hello world"}}这些消息是 automatically displayed when the app is in background ,如果应用程序已经在前台,则会调用 FirebaseMessagingService.onMessageReceived() .
{"notification" : { "body" : "hello world"}}
data-messages:有效载荷 {"data" : { "key1" : "value1"}}这些消息 always invoke FirebaseMessagingService.onMessageReceived() ,即使应用程序已关闭或在后台运行 .
{"data" : { "key1" : "value1"}}
click_action 是通知有效负载的参数,因此它适用于display-messages .
click_action
表示与用户单击通知关联的操作 . 如果设置了此选项,则会在用户单击通知时启动具有匹配意图过滤器的活动 .
https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
看起来this section of the guide是背景应用程序难题的关键:
接收消息使用扩展FirebaseMessagingService的服务 . 您的服务应覆盖为大多数消息类型提供的onMessageReceived回调,但以下情况除外:当您的应用在后台时发送的通知 . 在这种情况下,通知将传递到设备的系统托盘 . 用户点按通知会默认打开应用启动器 . 具有通知和数据有效负载的消息 . 在这种情况下,通知将传递到设备的系统托盘,并且数据有效负载将在启动器活动的附加内容中传递 .
从本质上讲,当应用程序背景化时,它不会真正响应或在此时运行 . 因此,消息将传递到系统托盘 . 但是,就在下面,解释了解决方案 .
如果要打开应用程序并执行特定操作[在后台运行时],请在通知有效内容中设置click_action并将其映射到要启动的活动中的intent过滤器 . 例如,将click_action设置为OPEN_ACTIVITY_1以触发如下所示的intent过滤器:
<intent-filter> <action android:name="OPEN_ACTIVITY_1" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
我总结了这里的步骤,希望它有所帮助
STEP 1
关于FCM user guide . 通过从Firebase console推送消息确保一切正常 .
STEP 2
更改自定义FirebaseMessagingService类,如下所示:
public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); startActivity(new Intent(this, SplashActivity.class)); } }
现在再次使用Firebase控制台推送消息,您会发现 onMessageReceived 仅在您的应用位于前台时触发 . 因为Firebase控制台只能发送 Notification message . 为了发送 Data message ,我们需要第3步 .
onMessageReceived
Notification message
Data message
STEP 3
安装Google Advanced REST client
输入以下参数:
url: https://fcm.googleapis.com/fcm/send method: POST Raw header: Content-Type: application/json Authorization:key=YOUR_SERVER_KEY Raw payload: { "to" : "YOUR_DEVICE_FCM_TOKEN", "data" : { "Nick" : "Mario", "body" : "great match!", "Room" : "PortugalVSDenmark" }, }
您可以在Firebase控制台>设置窗格> Cloud 消息传递选项卡中使用YOUR_SERVER_KEY
onTokenRefresh() 上的YOUR_DEVICE_FCM_TOKEN为 FirebaseInstanceId.getInstance().getToken()
onTokenRefresh()
FirebaseInstanceId.getInstance().getToken()
NOTE
在没有用户交互的情况下启动UI是糟糕的用户体验,您可能需要将启动活动替换为启动服务或后台的某些内容 . 我只是将活动用于测试目的,因此它比服务更具视觉效果 . 感谢@2ndgab介绍Google Advanced REST客户端工具 .
[Android]如果您使用的是Firebase通知(不是Firebase Cloud 消息传递),您只需在其中包含Firebase消息传递build.gradle,然后将您的应用链接到Firebase控制台上的项目 .
如果您的应用程序位于后台,则从控制台发送的任何消息都会为您提供系统通知,如果触摸该通知,将激活您的应用程序 .
看看这里:https://youtu.be/KpTSpVh9SfY?t=10m22s
4 回答
快速回答:
要通过FCM自动打开应用程序,您需要使用
data-message
,它保证始终调用FirebaseMessagingService.onMessageReceived()
方法 .然后,您可以在
.onMessageReceived()
方法中添加逻辑以启动首选活动 .WARNING: 在没有任何用户交互的情况下启动UI对于大多数应用程序来说是非常糟糕的做法!请在这里阅读MarkG答案:How to start an Activity from a Service?
完整解释:
FCM与GCM的工作方式类似,可以接收两种类型的消息:
display-messages:
有效载荷
{"notification" : { "body" : "hello world"}}
这些消息是 automatically displayed when the app is in background ,如果应用程序已经在前台,则会调用
FirebaseMessagingService.onMessageReceived()
.data-messages:
有效载荷
{"data" : { "key1" : "value1"}}
这些消息 always invoke
FirebaseMessagingService.onMessageReceived()
,即使应用程序已关闭或在后台运行 .
click_action
是通知有效负载的参数,因此它适用于display-messages .https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
看起来this section of the guide是背景应用程序难题的关键:
从本质上讲,当应用程序背景化时,它不会真正响应或在此时运行 . 因此,消息将传递到系统托盘 . 但是,就在下面,解释了解决方案 .
我总结了这里的步骤,希望它有所帮助
STEP 1
关于FCM user guide . 通过从Firebase console推送消息确保一切正常 .
STEP 2
更改自定义FirebaseMessagingService类,如下所示:
现在再次使用Firebase控制台推送消息,您会发现
onMessageReceived
仅在您的应用位于前台时触发 . 因为Firebase控制台只能发送Notification message
. 为了发送Data message
,我们需要第3步 .STEP 3
安装Google Advanced REST client
输入以下参数:
您可以在Firebase控制台>设置窗格> Cloud 消息传递选项卡中使用YOUR_SERVER_KEY
onTokenRefresh()
上的YOUR_DEVICE_FCM_TOKEN为FirebaseInstanceId.getInstance().getToken()
NOTE
在没有用户交互的情况下启动UI是糟糕的用户体验,您可能需要将启动活动替换为启动服务或后台的某些内容 . 我只是将活动用于测试目的,因此它比服务更具视觉效果 . 感谢@2ndgab介绍Google Advanced REST客户端工具 .
[Android]如果您使用的是Firebase通知(不是Firebase Cloud 消息传递),您只需在其中包含Firebase消息传递build.gradle,然后将您的应用链接到Firebase控制台上的项目 .
如果您的应用程序位于后台,则从控制台发送的任何消息都会为您提供系统通知,如果触摸该通知,将激活您的应用程序 .
看看这里:https://youtu.be/KpTSpVh9SfY?t=10m22s