收到推送通知时如何自动打开应用程序?



我想在收到推送通知时自动打开应用程序。 我已经尝试过,但它仍然没有按预期工作。 下面的代码在应用程序处于活动状态或处于 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中的"应用程序"概念略有扩展。

一个应用程序 - 技术上是一个进程 - 可以有多个活动,服务,内容提供商和/或广播听众。如果其中至少有一个正在运行,则应用程序已启动并正在运行(进程(。

因此,您必须确定的是您希望如何"启动应用程序"。

好的...以下是您可以尝试的内容:

  1. 创建具有action=MAINcategory=LAUNCHER的意图
  2. 使用context.getPackageManager从当前上下文中获取PackageManager
  3. 意图category=LAUNCHER, action=MAINpackageManager.resolveActivity(<intent>, 0)获得主/启动器的第一个活动的packageManager.queryIntentActivity(<intent>, 0)
  4. 获取您感兴趣的ActivityInfo
  5. ActivityInfo,获取packageName和名称
  6. 最后,使用category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)和 setFlags(Intent.FLAG_ACTIVITY_NEW_TASK( 创建另一个意图
  7. 最后,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);
}
}

快乐的编码:)

相关内容

  • 没有找到相关文章

最新更新