如何在Android应用中处理/处理Firebase Cloud Messaging的数据有效负载(包括通知)?

时间:2017-05-14 12:14:24

标签: java android firebase firebase-cloud-messaging

我有一个关于接收带有通知和数据有效负载的Firebase消息的问题。 documentation表示数据将在意图的附加内容中到达"。

我的问题是哪个意图(或活动)?当将应用程序切换到后台时,将有一个用户停止的屏幕。那么,我是否需要尝试在我的应用中检索Extra for all Intents / Activities?

一旦应用程序到达前台,我在何处以及如何实际编码以检索数据有效负载?

谢谢!

增加:

我的意思是,我有10个以上的活动,当应用程序完成时会有更多活动。那么,我是否必须检索所有活动的Extra以查看是否已使用任何Push数据有效负载重新打开该应用程序?

2 个答案:

答案 0 :(得分:2)

在您在问题中链接的文档中,它指出:

  

包含通知和数据有效负载的消息,包括背景和   前景。在这种情况下,通知将传递给   设备的系统托盘,数据有效负载在附加功能中提供   您的启动器活动

的意图

使用类别LAUNCHER在清单中指定启动器活动。例如:

    <activity
        android:name="com.example.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

您可以覆盖默认行为以指定其他活动。在message notification data中,使用操作字符串的值添加属性click_action。然后创建活动并在清单中为其提供与该操作匹配的intent过滤器。例如,使用消息:

{
  "to": "dhVgCGVkTSR:APA91b...mWsm3t3tl814l",
  "notification": {
    "title": "New FCM Message",
    "body": "Hello World!",
    "click_action": "com.example.FCM_NOTIFICATION"
  },
  "data": {
    "score": "123"
  }
}

像这样定义意图过滤器:

    <activity android:name=".MyFcmNotificationActivity">
        <intent-filter>
            <action android:name="com.example.FCM_NOTIFICATION" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

为了澄清文档,在收到消息时,数据有效负载不会传递给活动;它是在用户点击通知时发送的。

答案 1 :(得分:0)

您必须扩展onMessageReceived类。

并覆盖@Override public void onMessageReceived(RemoteMessage remoteMessage) { // ... // TODO(developer): Handle FCM messages here. Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. } 方法。

public System.Data.DataTable ReadExcel(string fileName, string fileExt, strig SheetName)
    {
        string conn = string.Empty;
        System.Data.DataTable dtexcel = new System.Data.DataTable();
        if (fileExt.CompareTo(".xls") == 0)
            conn = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HRD=Yes;IMEX=1';"; //for below excel 2007  
        else
            conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=YES';"; //for above excel 2007  
        using (OleDbConnection con = new OleDbConnection(conn))
        {
            try
            {
     String Query = String.Format("select * from [{0}]",SheetName);         
       // [sheet1] = [YouerSheetNameinExcelFile]
                //OleDbDataAdapter oleAdpt = new OleDbDataAdapter("select * from [sheet1]", con); //here we read data from sheet1  
                OleDbDataAdapter oleAdpt = new OleDbDataAdapter(Query, con); //here we read data from sheet1 and from specific cell range.   
                oleAdpt.Fill(dtexcel); //fill excel data into dataTable  
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        return dtexcel;
    }

确保在清单中注册服务。