当管理员从控制面板激活用户帐户时,我的应用程序会收到FCM通知,我想从一个方法做一些操作,比如吐司或当用户点击推送通知时从我的数据库中删除一些数据。!
这可能吗?
这是FirebaseMessagingService
class
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());
}
}
答案 0 :(得分:1)
是的,你可以使用意图传递一些整数值
putextra
用于活动和onCreate
活动中的参考
class只需检查if条件并相应地进行更改。
答案 1 :(得分:1)
您需要在监听器中添加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;
}
}
答案 2 :(得分:1)
逻辑是在intent中添加一个额外的参数,并在启动活动中检查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
}
}
答案 3 :(得分:1)
要让应用在后台时可以点击通知,您需要在通知有效负载中使用click_action
属性。这与FirebaseMessagingService
和其他此类类完全分开,因为这些类在应用程序位于前台时起作用。
请查看Firebase文档的section。
此外,当您定义click_action
属性时,您还需要在要启动的活动的<action>
中使用相应的<intent-filter>
属性。
这video以非常详细的方式解释了它。
但请注意,如果您要从Firebase控制台发送通知,则无法设置click__action
属性。只有从自己的管理服务器或使用Firebase云功能发送通知时,才能执行此操作。
最后,在启动的活动中,您可以使用数据属性设置其他Data
(也显示在我上面链接的同一文档中)。当您通过单击通知启动应用程序时,您可以使用getIntent()
获取通知数据。查看this answer了解有关如何执行此操作的详细信息。
它非常简单而优雅。
<强>更新强>
例如,如果您的通知有效内容具有以下结构,
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。
这样,您就可以打开所需的活动,并可以使用从您的通知中获得的相关详细信息填充该活动。
答案 4 :(得分:1)
我建议你添加一个&#34;标志&#34;当您开始活动的意图时,要查看用户来自哪个活动,如下所示:
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
}
希望它有所帮助。