我已经在我的应用中实现了Firebase,并且正在发送带有额外数据的推送。当我的应用处于前台时,我正在正确处理数据并显示自己的通知,但是当 Firebase 在应用"托管"(未终止(时"自动"显示通知时,我在获取数据时遇到了问题。根据 DOCSActivity
应该获得新的Intent
,并满足我的价值观的额外功能,而不是应用程序只是回到前面,旧状态恢复。
场景:
- 打开应用程序,按主页 通过Firebase
- 控制台发送推送,Firebase正在创建
Notification
而不调用onMessageReceived
(根据文档中的表格,它应该吗? - 当用户选择通知应用程序将以与"托管"相同的状态置于前面时,并且
Intent
通过用于顶部打开Activity
的"原始"附加功能来实现
我在onCreate
、onNewIntent
、onResume
(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 种状态传递:
- 通知
- 数据
- 通知和数据
后台处理:
对于 2. 将在没有 UI 和其他处理的情况下调用onMessageReceived
。稍后您可以显示一些自定义内容。
当涉及到3.Android将显示通知并保留数据,直到有用户交互。单击后,它只是恢复现有活动。不会触发您的onNewIntent
,因为您的启动模式未FLAG_ACTIVITY_SINGLE_TOP
。
您还应该检查您的日志猫输出:Google Play services out of date
。