2

我試圖讓Android BroadcastReceiver在Android系統收到Firebase雲消息通知時運行。用於BroadcastReceiver的Firebase-cloud-messaging意圖過濾器是什麼?

public class MyBroadcastReceiver extends BroadcastReceiver { 

private static final String TAG = "MyBroadcastReceiver"; 

@Override 
public void onReceive(final Context context, Intent intent) { 


    Toast.makeText(context, "EVENT OCCURED", Toast.LENGTH_LONG).show(); 

    } 
} 

,要求在AndroidManifest這樣指定接收標籤:

<receiver 
     android:name=".MyBroadcastReceiver" android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
      <action android:name="com.google.firebase.MESSAGING_EVENT" /> 
     </intent-filter> 
    </receiver> 

正如你可以在清單見上面,我說:

<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 

確保當我將電纜插入Android設備時,BroadcastReceiver會閃光。它工作正常。

因此,問題出在:

<action android:name="com.google.firebase.MESSAGING_EVENT" /> 

不是由廣播接收器的認可這個意向篩選器操作? BroadcastReceiver使用的Firebase消息是否存在另一種意圖過濾器操作?

回答

2

Android Intent消息系統在三個「通道」中處理Intents:活動,服務和BroadcastReceivers。 publishing an Intent的方法指示通道類型:startActivity()startService()sendBroadcast()。用startService()發佈的意圖只會匹配服務的意圖過濾器。它不針對活動和BroadcastReceivers進行測試。

由於動作com.google.firebase.MESSAGING_EVENT通常由來自FirebaseMessagingService的服務接收,因此動作必須在服務通道中發佈。您將無法使用BroadcastReceiver接收它。

+0

所以說我創建了一個android服務而不是BroadcastReceiver,我從不銷燬哪個監聽'com.google.firebase.MESSAGING_EVENT'。這可以工作嗎? – Jupiter

+0

是的。這是接收消息的常用方式,詳見[安裝文檔](https://firebase.google.com/docs/cloud-messaging/android/client#manifest)。您只需定義一個擴展[FirebaseMessagingService](https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService)的服務並在清單中聲明它。 –

+0

確實。我從一開始就這樣做了,但是這個實現並沒有解決我的問題。 FirebaseMessagingService類只在應用程序啓動時觸發。我試圖在應用未由Firebase消息發起時啓動服務。你還能建議先生嗎? – Jupiter