我已经在我的应用程序中实现了Firebase,并且正在发送带有额外数据的推送。当我的应用程序处于前台时,我可以正确处理数据并显示我自己的通知,但是当应用程序“驻留”(未终止)时,Firebase显示“自动”通知时,获取数据存在问题。根据{{3}} Activity
应该获得新的Intent
,并且附加值由我的价值观来满足,而应用程序只是回到最前面,恢复了旧状态。
场景:
Notification
而没有调用onMessageReceived
(根据文档中的表格,应该吗?)Intent
会在顶部打开Activity
时使用“原始”附加功能来实现我在onCreate
,onNewIntent
,onResume
(Activity
)和onMessageReceived
(Service
)中只有{{1 }}被称为,其中我将打印以下内容:
onResume
答案 0 :(得分:3)
同时具有通知和数据有效载荷(后台和前台)的消息。在这种情况下,数据有效载荷将交付给启动程序活动的其他目的。如果要在其他活动中使用它,则必须在数据有效负载上定义click_action。因此,您可以在启动器活动中获得更多的意图。
修改:-
从documentation:- 在后台时,应用程序会在通知托盘中接收通知有效载荷,并且仅在用户点击通知时处理数据有效载荷。
因此,在单击通知时,使用getIntent()附加项检查启动器活动的oncreate()方法。
答案 1 :(得分:2)
所以我一直在寻找这个答案并阅读相同的内容。必须在某些地方。 我知道这已经一岁了,但是他们仍然没有真正弄清楚。 在与通知关联的endingActivity中(在我的情况下是MainActivity) 我添加了以下内容。 请注意,我不是通过Google Codelabs com.example.android.eggtimernotifications进行工作的。
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")
}
}
}
}
}
这导致了以下结果。
数据键是谷物,牛奶和糖。
答案 2 :(得分:1)
根据文档Cloud messaging docs,消息可以三种状态发送:
背景处理:
对于2。onMessageReceived
将在没有UI和其他处理的情况下被调用。稍后,您可以显示一些自定义内容。
当涉及到3时,android将显示通知并保留数据,直到有用户交互为止。单击后,它只是恢复您现有的活动。您的onNewIntent
未启动,因为您的启动模式不是FLAG_ACTIVITY_SINGLE_TOP
。
您还应该检查logcat输出中是否有Google Play services out of date
。
答案 3 :(得分:0)
onMessageReceived()。我几个月前有这个问题。我通过重写handlerIntent方法解决它。但是您的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,则使用main活动。
启动意图后,您可以使用
getIntent().getExtras();
检索包含与通知消息一起发送的所有数据的Set。
有关通知消息的更多信息,请参见https://firebase.google.com/docs/cloud-messaging/android/receive#sample-receive