当应用在后台运行时,FCM 意图在哪里传递数据?



我已经在我的应用中实现了Firebase,并且正在发送带有额外数据的推送。当我的应用处于前台时,我正在正确处理数据并显示自己的通知,但是当 Firebase 在应用"托管"(未终止(时"自动"显示通知时,我在获取数据时遇到了问题。根据 DOCSActivity应该获得新的Intent,并满足我的价值观的额外功能,而不是应用程序只是回到前面,旧状态恢复。

场景:

  1. 打开应用程序,按主页
  2. 通过Firebase
  3. 控制台发送推送,Firebase正在创建Notification而不调用onMessageReceived(根据文档中的表格,它应该吗?
  4. 当用户选择通知应用程序将以与"托管"相同的状态置于前面时,并且Intent通过用于顶部打开Activity的"原始"附加功能来实现

我在onCreateonNewIntentonResume(Activity(和onMessageReceived(Service(中都有日志,只有onResume被调用,我在其中打印了如下所示的额外内容:

if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
Object value = getIntent().getExtras().get(key);
Log.d("Activity onResume", "Key: " + key + " Value: " + value);
}
}

同时包含通知和数据有效负载(后台和前台(的消息。在这种情况下,数据有效负载将传递给启动器活动意图的其他内容。如果要在其他活动中获取它,则必须在数据有效负载上定义click_action。因此,在您的启动器活动中获取额外的意图。

编辑:-

从文档:- 在后台时,应用会在通知托盘中接收通知有效负载,并且仅在用户点击通知时处理数据有效负载。

因此,在单击通知时,请使用getIntent((附加功能检查启动器活动的oncreate((方法。

所以我正在寻找这个答案并阅读相同的内容。它必须是某个地方。 我知道这是一年前的事情了,但他们仍然没有真正说清楚。 在与通知关联的待处理活动中(在我的情况下是主活动( 我添加了以下内容。 请注意,我正在通过Google Codelabs com.example.android.eggtimer通知工作,而不是答案中。

override fun onResume() {
super.onResume()
intent?.run {
val keys = this.extras?.keySet()
if (!keys.isNullOrEmpty()) {
keys.forEach { key ->
when (this.extras!![key]) {
is Long -> println("$key = ${this.getLongExtra(key, 0L)}")
is Int -> println("$key = ${this.getIntExtra(key, 0)}")
is String -> println("$key = ${this.getStringExtra(key)}")
is Boolean -> println("$key = ${this.getBooleanExtra(key, false)}")
else -> println("unkonwn Type")
}
}
}
}
}

这导致了以下结果。

  • I/系统输出:google.delivered_priority = 高
  • I/系统输出: google.sent_time = 1585284914411
  • I/System.out: google.ttl = 2419200
  • I/系统输出:google.original_priority = 高
  • I/系统输出:谷物 = 切碎
  • I/System.out: from =/topics/breakfast
  • I/系统输出:牛奶 = 1 杯
  • I/系统输出:糖 = 无
  • I/System.out: google.message_id = 0:1585284914700957%f6ddf818f6ddf818
  • I/System.out: collapse_key = com.example.android.eggtimernotifications

数据密钥是谷物,来自牛奶和糖。

当应用程序在后台时,不会调用onMessageReceived((。几个月前我遇到了这个问题。我通过覆盖处理程序意图方法解决它。但是您的 Firebase 消息传递库应该

implementation 'com.google.firebase:firebase-messaging:10.2.1'

然后:

@Override
public void handleIntent(Intent intent) {
try
{
if (intent.getExtras() != null)
{
RemoteMessage.Builder builder = new RemoteMessage.Builder("MessagingService");
for (String key : intent.getExtras().keySet())
{
builder.addData(key, intent.getExtras().get(key).toString());
}
onMessageReceived(builder.build());
}
else
{
super.handleIntent(intent);
}
}
catch (Exception e)
{
super.handleIntent(intent);
}
}

如果您不想降级您的库,那么

您可以指定一个click_action来指示在用户点击通知时应启动的意图。如果未指定click_action则使用主活动。

启动 Intent 时,您可以使用

getIntent().getExtras();

以检索包含与通知消息一起发送的任何数据的 Set。

有关通知消息的更多信息,请参阅 https://firebase.google.com/docs/cloud-messaging/android/receive#sample-receive

根据文档,云消息传递文档消息可以以 3 种状态传递:

  1. 通知
  2. 数据
  3. 通知和数据

后台处理:

对于 2. 将在没有 UI 和其他处理的情况下调用onMessageReceived。稍后您可以显示一些自定义内容。

当涉及到3.Android将显示通知并保留数据,直到有用户交互。单击后,它只是恢复现有活动。不会触发您的onNewIntent,因为您的启动模式未FLAG_ACTIVITY_SINGLE_TOP

您还应该检查您的日志猫输出:Google Play services out of date

相关内容

  • 没有找到相关文章

最新更新