从 firebase 通知中打开特定活动

Posted

技术标签:

【中文标题】从 firebase 通知中打开特定活动【英文标题】:open a specific activity from firebase notification 【发布时间】:2017-02-01 11:32:53 【问题描述】:

我将 firebase 通知集成到我的应用程序中,但我想发送一个通知以打开特定活动并执行我计划执行的操作,而不仅仅是打开应用程序。就像一个通知,它会推动用户在点击它时访问 Google Play 商店。

我看到了我使用的代码Firebase console: How to specify click_action for notifications,但在初始化变量 cls 时出现错误。我试图通过定义 cls=null 来解决,以清除错误。它无法使用 click_action 打开我指定的活动

public class ClickActionHelper  
    public static void startActivity(String className, Bundle extras, Context context) 
        Class cls=null; 
        try  
            cls = Class.forName(className);
         catch (ClassNotFoundException e)  
            //means you made a wrong input in firebase console 
         
        Intent i = new Intent(context, cls);
        i.putExtras(extras); context.startActivity(i); 
         

请问我有什么问题吗?我该如何让它发挥作用?

【问题讨论】:

【参考方案1】:

如果您想打开您的应用并执行特定操作 [在后台运行时],请在通知负载中设置 click_action 并将其映射到您要启动的 Activity 中的意图过滤器。例如,将 click_action 设置为 OPEN_ACTIVITY_1 以触发如下意图过滤器:

按照 FCM 文档中的建议,要求后端以这样的形式发送 JSON 数据,


    "to": "some_device_token",

    "content_available": true,
    "notification": 
        "title": "hello",
        "body": "yo",
        "click_action": "OPEN_ACTIVITY_1" // for intent filter in your activity
    ,

    "data": 
        "extra": "juice"
    

并在您的 mainfest 文件中为您的活动添加意图过滤器,如下所示

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

当您单击通知时,它将打开应用程序并直接转到您在 click_action 中定义的活动,在本例中为“OPEN_ACTIVTY_1”。在该活动中,您可以通过以下方式获取数据:

Bundle b = getIntent().getExtras();// add these lines of code to get data from notification
String someData = b.getString("someData");

查看以下链接以获得更多帮助:

Firebase FCM notifications click_action payload

Firebase onMessageReceived not called when app in background

Firebase console: How to specify click_action for notifications

【讨论】:

【参考方案2】:

我知道这个问题已经存在了一段时间,但我还是想展示我的解决方案。它比介绍的要简单得多。所以现在我在徘徊,如果它是不好的做法。但它有效: 我使用有效载荷 json 对象来存储一个整数:

JSONObject payload = data.getJSONObject("payload");
int destination = payload.getInt("click_action");

然后我只使用一个简单的 switch 语句根据整数结果启动正确的活动:

Intent resultIntent;
switch(destination)
    case 1:
        resultIntent = new Intent(getApplicationContext(), UserProfileActivity.class);
        resultIntent.putExtra("message", message);
        break;
    default:
        resultIntent = new Intent(getApplicationContext(), MainActivity.class);
        resultIntent.putExtra("message", message);
        break;

简单。

【讨论】:

【参考方案3】:
<activity android:name=".design.NotificationActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true"
        android:parentActivityName=".MainActivity"
        >
        <intent-filter>
            <action android:name="NotificationActivity" />
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>

    </activity>

        $ url = "https://fcm.googleapis.com/fcm/send";
        $token = "";
        $serverKey = '';
        $title = "your title";
        $body = "mesaage";
        $notification = array('title' =>$title ,
        'body' => $body, 
        'sound' => 'default',
        'badge' => '1',
        'click_action' => 'NotificationActivity'
        );
        $arrayToSend = array('to' => $token, 'notification' => $notification,'priority'=>'high');
        $json = json_encode($arrayToSend);
        $headers = array();
        $headers[] = 'Content-Type: application/json';
        $headers[] = 'Authorization: key='. $serverKey;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
        //Send the request
        $response = curl_exec($ ch);
        //Close request
        if ($response === FALSE) 
        die('FCM Send Error: ' . curl_error($ch));
        
        curl_close($ch)

【讨论】:

以上是关于从 firebase 通知中打开特定活动的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中单击通知时打开特定活动

如何使用 ionic 3 和 Firebase Cloud Messaging 从通知栏打开特定页面?

Firebase FCM通知click_action有效内容

如何通过单击 firebase 通知打开新活动并在 textview 上打印通知消息

当应用程序不在前台时,特定活动不会从通知单击打开(应用程序是最近的,没有被杀死!)

点击打开登录活动而不是主要活动的通知