![](/img/trans.png)
[英]Extra Intent data getting null when application in background for FCM
[英]Where is FCM Intent with data delivered, when app is in background?
我已經在我的應用程序中實施了 Firebase,並且正在發送帶有額外數據的推送。 當我的應用程序處於前台時,我正在正確處理數據並顯示我自己的通知,但是當 Firebase 在應用程序“歸巢”(未終止)時“自動”顯示通知時,我在獲取數據時遇到了問題。 根據DOCS , Activity
應該獲得新的Intent
,並用我的價值觀實現額外的功能,而不是應用程序回到前面,恢復舊狀態。
設想:
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() extras 檢查啟動器活動的 oncreate() 方法。
所以我一直在尋找這個答案並閱讀相同的內容。 它必須在某個地方。 我知道這是一歲了,但他們還沒有真正說清楚。 在與通知關聯的 pendingActivity 中(在我的例子中是 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")
}
}
}
}
}
這導致了以下結果。
數據鍵是谷物、牛奶和糖。
根據文檔Cloud messaging docs消息可以以 3 種狀態傳遞:
后台處理:
對於 2. onMessageReceived
將在沒有 UI 和額外處理的情況下被調用。 稍后你可以展示一些定制的東西。
當涉及到3時,android會顯示通知並保持數據,直到有用戶交互。 單擊后,它只是恢復您現有的活動。 您的onNewIntent
未被觸發,因為您的啟動模式不是FLAG_ACTIVITY_SINGLE_TOP
。
您還應該檢查您的 logcat 輸出: Google Play services out of date
。
應用程序在后台時不會調用 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,則使用主要活動。
啟動意圖時,您可以使用
getIntent().getExtras();
檢索一個 Set,其中包含隨通知消息一起發送的任何數據。
有關通知消息的更多信息,請參閱https://firebase.google.com/docs/cloud-messaging/android/receive#sample-receive
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.