Открыть конкретное действие из уведомления Firebase
Я интегрировал в свое приложение уведомление firebase, но я хотел бы отправить уведомление, которое открывает конкретное действие и выполняет то, что я планирую сделать, а не просто открывать приложение. как уведомление, которое подтолкнет пользователя посетить Google Play Store при нажатии на него.
Я видел код консоли Firebase: как указать click_action для уведомлений, которые я использовал, но получаю ошибку при инициализации переменных 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);
}
}
пожалуйста, я что-то не так делаю? Как мне заставить это работать?
2 ответа
Если вы хотите открыть свое приложение и выполнить определенное действие [в то время как в фоновом режиме], установите 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 Полезная нагрузка click_action
Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме
Я знаю, что этот вопрос был давно, но я все равно хотел показать свое решение. это намного проще, чем представленные. так что теперь я брожу, если это плохая практика. но это работает: я использую объект полезной нагрузки 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;
}
Просто.
<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)