首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在收到推送通知时自动打开应用程序?

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

Stack Overflow用户
提问于 2018-05-16 10:40:51
回答 3查看 8.9K关注 0票数 7

我想自动打开应用程序时,收到推送通知。我试过了,但还是没有像我预期的那样起作用。当应用程序处于活动状态或在MainActivity中时,下面的代码是工作的,但是当应用程序在后台或者仅仅在托盘上显示通知时,它就不能工作了。我错过了什么吗?

代码语言:javascript
运行
复制
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);
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-16 10:49:05

这件事需要从后端处理,

下面是您现在使用的一个示例有效载荷,{ "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" } } }

区别在于您需要从后端发送数据有效负载而不是通知poayload。

票数 3
EN

Stack Overflow用户

发布于 2018-05-16 10:47:42

代码语言:javascript
运行
复制
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);

然后像这样添加PendingIntent

代码语言:javascript
运行
复制
notificationBuilder = new NotificationCompat.Builder(this)
            .setContentTitle("Notification")
            .setSmallIcon(R.mipmap.icon_notif)
            .setContentText(messageBody)
            .setContentIntent(contentIntent);
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setDefaults(Notification.DEFAULT_LIGHTS );
票数 1
EN

Stack Overflow用户

发布于 2018-05-16 11:45:48

首先,Android中的“应用程序”概念是一个稍微扩展的概念。

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

因此,您需要识别的是如何“启动应用程序”。

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

  1. 使用action=MAINcategory=LAUNCHER创建意图
  2. 使用PackageManager从当前上下文获取context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0),其中意图是使用main/launcher获取第一个活动的category=LAUNCHER, action=MAINpackageManager.resolveActivity(<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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50368716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档