我想在收到推送通知时自动打开应用程序。 我已经尝试过,但它仍然没有按预期工作。 下面的代码在应用程序处于活动状态或处于 MainActivity 中时有效,但当应用程序在后台或仅在托盘上显示通知时不起作用。 我错过了什么吗?
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getNotification() != null) {
if (PreferencesUtil.getInstance(this).isLoggedIn()) {
sendNotification(remoteMessage.getData().get("order_id"));
}
}
}
public void sendNotification(String messageBody) {
NotificationManager notificationManager = null;
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder notificationBuilder;
notificationBuilder = new NotificationCompat.Builder(this)
.setContentTitle("Notification")
.setSmallIcon(R.mipmap.icon_notif)
.setContentText(messageBody)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_LIGHTS );
//add sound
try {
Uri sound = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.siren);
Ringtone ringtone = RingtoneManager.getRingtone(this, sound);
ringtone.play();
notificationBuilder.setSound(sound);
} catch (Exception e) {
e.printStackTrace();
}
//vibrate
long[] v = {1000, 1000, 1000, 1000, 1000};
notificationBuilder.setVibrate(v);
notificationManager.notify(0, notificationBuilder.build());
Intent i = new Intent(this, NotificationActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
}
这是需要从后端处理的事情,
这是您现在正在使用的示例有效负载,{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
这只会让你控制在你的应用处于前台时操作和执行一些操作,否则只需发出通知。
有关详细信息,您可以在此处查看。
现在,要始终控制您的通知,您需要如下所示的有效负载,
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
不同之处在于您需要发送数据有效负载,而不是从后端发送通知负载。
int requestID = (int) System.currentTimeMillis();
Intent notificationIntent = new Intent(getApplicationContext(), NotificationActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, requestID,notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
并像这样添加待定意图
notificationBuilder = new NotificationCompat.Builder(this)
.setContentTitle("Notification")
.setSmallIcon(R.mipmap.icon_notif)
.setContentText(messageBody)
.setContentIntent(contentIntent);
.setPriority(NotificationCompat.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_LIGHTS );
首先,Android中的"应用程序"概念略有扩展。
一个应用程序 - 技术上是一个进程 - 可以有多个活动,服务,内容提供商和/或广播听众。如果其中至少有一个正在运行,则应用程序已启动并正在运行(进程(。
因此,您必须确定的是您希望如何"启动应用程序"。
好的...以下是您可以尝试的内容:
- 创建具有
action=MAIN
和category=LAUNCHER
的意图 - 使用
context.getPackageManager
从当前上下文中获取PackageManager
- 意图
category=LAUNCHER, action=MAIN
或packageManager.resolveActivity(<intent>, 0)
获得主/启动器的第一个活动的packageManager.queryIntentActivity(<intent>, 0)
- 获取您感兴趣的
ActivityInfo
- 从
ActivityInfo
,获取packageName
和名称 - 最后,使用
category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)
和 setFlags(Intent.FLAG_ACTIVITY_NEW_TASK( 创建另一个意图 - 最后,
context.startActivity(newIntent)
我举了这种情况的完整例子。根据接收的数据有效负载,我将向一个数字发送消息(无论我的应用程序是完全被杀死还是在后台还是在前台(
{
"registration_ids":["cMcyU3CaSlCkjPh8C0qo-n:APA91bFwOhNAwYp5vEEztv_yD_vo1fWt7TsiKZQ8ZvIWx8CUKZa8CNVLAalxmV0FK-zwYgZnwdAnnVaHjUHYpqC89raTLXxAfUWc2wZu94QWCnv14zW4b_DwDUMBpDo3ybP3qf5Y5KM2"],
"data": {
"number": "6299018534",
"msg": "Hii i am sidharth"
}
}
当您从服务器发送此类型的数据通知时,无论您的应用程序是在后台还是前台,这都将在 onMessageReceived 中接收。 所以,安卓代码看起来像这样:
public class NotificationServices extends FirebaseMessagingService {
@Override
public void onMessageReceived(@NonNull RemoteMessage message) {
super.onMessageReceived(message);
if(message.getData().size()>0){
String number = null,msg = null;
if(message.getData().get("number") !=null){
number= message.getData().get("number");
}
if(message.getData().get("msg") !=null){
msg= message.getData().get("msg");
}
sendSms(number,msg);
}
}
@Override
public void onNewToken(@NonNull String token) {
super.onNewToken(token);
}
private void sendSms(String phone,String sms){
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phone,null,sms,null,null);
}
}
快乐的编码:)