当管理员从控制面板激活用户帐户时,我的应用程序会收到 FCM 通知,我想通过 toast 等方法执行一些操作,或者在用户单击推送通知时从我的数据库中删除一些数据。!
这可能吗?
这是类FirebaseMessagingService
代码
public class CustomFirebaseMessagingService extends FirebaseMessagingService {
public static String INTENT_FILTER = "INTENT_FILTER";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
try {
if (remoteMessage.getNotification() != null) {
Intent intent = new Intent(INTENT_FILTER);
sendNotification(remoteMessage.getNotification().getBody(), intent);
sendBroadcast(intent);
}
} catch (Exception ex) {
}
}
private void sendNotification(String messageBody, Intent intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.logo)
.setContentTitle("UPDATE")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
若要在应用处于后台时可单击通知,需要在通知有效负载中使用click_action
属性。这与FirebaseMessagingService
和其他此类类完全分开,因为它们在应用位于前台时起作用。
请查看 Firebase 文档的此部分。
此外,当您定义click_action
属性时,您还需要在要启动的活动的<intent-filter>
中具有相应的<action>
属性。
该视频以非常详细的方式解释了它。
不过,请注意,如果您从 Firebase 控制台发送通知,则无法设置click__action
属性。只有当您从自己的管理服务器或使用 Firebase Cloud Functions 发送通知时,才能执行此操作。
最后,在启动的活动中,您可以使用 data 属性设置其他Data
(也显示在我上面链接的同一文档中(。当您通过单击通知启动应用程序时,您可以使用getIntent()
.查看此答案以获取有关如何执行此操作的更多详细信息。
它真的非常简单和优雅。
更新
例如,如果通知有效负载具有以下结构,
payload = {
notification: {
title: `You ordered a new product`,
click_action : 'HANDLE_NOTIFICATION',
},
data : {
product_id : 'ABC98292',
type : `Clothes`,
product_name : 'Cotton spring shirt'
}
};
然后,将筛选器放在单击通知时要打开的活动的标记中。一个例子如下:-
<intent-filter>
<action android:name="HANDLE_NOTIFICATION" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
然后,您可以使用getIntent().getStringsExtra("product_id")
等从通知中获取product_id。
这样,您将打开所需的活动,并可以使用从通知中获得的相关详细信息填充它。
您需要在活动中向侦听器添加传入通知的LocalBroadcastReceiver
:
boolean isReceiverRegistered = false ; // to not create receiver twice
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBroadcastReceiver = new MyBroadcastReceiver();
registerReceiver();
//code
}
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action) {
case YOUR_ACTION:
handleIncomingAction(intent);
break;
}
}
}
private void registerReceiver() {
if (!isReceiverRegistered) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(YOU_ACTION);
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(mBroadcastReceiver, intentFilter);
isReceiverRegistered = true;
}
}
逻辑是在意图中添加一个额外的参数,并在启动活动中检查该参数 onCreate 方法。
private void sendNotification(String messageBody, Intent intent) {
// set extra param
intent.putExtra("is_from_notification", true);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.logo)
.setContentTitle("UPDATE")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
在您的活动中
@override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
if (getIntent().getBooleanExtra("is_from_notification", false)) {
// TODO: do whatever you want in here
}
}
是的,你可以这样做,只需传递一些整数值,意图使用putextra
在活动和活动onCreate
中参考 类只需检查 if 条件并相应地进行更改。
我建议您在启动活动的意图时添加一个"标志",以查看用户来自哪个活动,如下所示:
Intent intent = new Intent(NotificationActivity.this, SecondActivity.class);
intent.putExtra("call_from", "NotificationActivity");
并返回:
String fromActivity = (String) getIntent().getExtras().get("call_from");
if(fromActivity.equals(NotificationActivity.class.getSimpleName())) {
//call your method to delete what you want
}
希望对您有所帮助。