当目标活动打开时,单击通知不会打开新活动

Posted

技术标签:

【中文标题】当目标活动打开时,单击通知不会打开新活动【英文标题】:clicking on the notification do not open new activity when its target activity is open 【发布时间】:2018-03-12 18:42:19 【问题描述】:

我有两个活动 MainActivity 和 ReceivedMessageActivity。以及一个后台服务,用于从中获取 Context 并传递给 SMSReceiver,该服务扩展 BroadcastReceiver 以接收短信。当收到短信时 SMSReceiver 创建通知。我希望当我单击通知时,如果应用程序未运行,则打开 ReceivedMessageActivity,当应用程序运行时,如果 ReceivedMessageActivity 已打开,请不要按意图创建新的 Activity,而只是将 ReceivedMessageActivity 放在前面。我将清单中的 launchMode 设置为 singleTop ,因为 MainActivity 正在工作,但 ReceivedMessageActivity 不起作用!我将通知意图标志设置为 FLAG_ACTIVITY_BROUGHT_TO_FRONT|Intent.FLAG_ACTIVITY_SINGLE_TOP 和 FLAG_ACTIVITY_CLEAR_TOP 但不起作用。我将 ReceivedMessageActivity 的 manifest launchMode 设置为 singleInstance 它的工作,但是当我手动午餐 ReceivedMessageActivity 时,它的默认动画不起作用(从右到左动画)。这是我的通知代码:

public void addNotifiction(String title, String message) 
    NotificationCompat.Builder builder = new     
    NotificationCompat.Builder(context);
    builder.setContentTitle(title);
    builder.setContentText(message);
    builder.setStyle(new 
    NotificationCompat.BigTextStyle().bigText(message));
    builder.setAutoCancel(true);
    builder.setDefaults(Notification.DEFAULT_ALL);
    builder.setSmallIcon(R.drawable.edit_icon);
    builder.setCategory(NotificationCompat.CATEGORY_MESSAGE);
    builder.setPriority(NotificationCompat.PRIORITY_MAX);

    Intent notifactionIntent = new Intent(context,     
    ReceivedMessagesActivity.class);
    notifactionIntent 
  .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
    TaskStackBuilder taskStackBuilder=TaskStackBuilder.create(context);
    taskStackBuilder.addNextIntentWithParentStack(notifictionIntent);
    PendingIntent contentPendingIntent= taskStackBuilder.getPendingIntent (0,PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentPendingIntent);
    NotificationManager manager = (NotificationManager) context.getSystemService (Context.NOTIFICATION_SERVICE);

    manager.notify(NOTIFICATION_ID++, builder.build());

我的上下文是 MyService 类上下文:

Context context=MyService.context

EDIT:我发现当我使用android:parentActivityName=".MainActivity" 在接收消息活动的清单中发生这种情况,当我点击通知并打开接收消息活动时,我的应用程序创建新的接收消息活动为什么?

【问题讨论】:

在应用处于后台时尝试使用 implcit intent 和未决意图! 我们如何理解非法意图? intent 用intent-filter 初始化给一个活动 P.S idk TaskStackBuilder 是什么 【参考方案1】:

来自我的一个应用程序的通知制作者的基本骨架希望它有所帮助:

Context context = getApplicationContext();
String title = context.getString(R.string.title);
String subtitle = context.getString(R.string.subtitle);

Notification.Builder notificationBuilder = null;
//        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

Intent intent = new Intent(getBaseContext(), ReceivedMessageActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_SINGLE_TOP);

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) 

    notificationBuilder = new Notification.Builder(
            context,
            CHANNEL_ID)
    ) //
            .setContentTitle(title)
            .setContentText(subtitle)
            .setSmallIcon(R.drawable.icon)
            .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
            .setContentIntent(
                    PendingIntent.getActivity(
                            getBaseContext(),
                            0,
                            intent,
                            0
                    )
            )
            .setAutoCancel(true);

 else 
    notificationBuilder = new Notification.Builder(context) //
            .setContentTitle(title)
            .setContentText(subtitle)
            .setSmallIcon(R.drawable.icon)
            .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
            .setContentIntent(
                    PendingIntent.getActivity(
                            getBaseContext(),
                            0,
                            intent,
                            0
                    )
            )
            .setAutoCancel(true);

startForeground(NOTIFICATION_ID, notificationBuilder.build());// only in case you are in service

以下代码未经测试

【讨论】:

这不是我想要的答案,如果我点击通知时活动已打开,不要创建新的相同活动 此代码执行所需的相同任务,我已经在使用此代码 阅读我编辑的帖子。你对此有什么想法吗?什么是 startForeground ? startForeground 不适合我

以上是关于当目标活动打开时,单击通知不会打开新活动的主要内容,如果未能解决你的问题,请参考以下文章

应用程序打开时如何获得推送通知?

单击通知不会在后台打开活动

一旦来自附近位置的新数据进入relatime数据库,如何发送通知(当应用程序未打开时)?

我想对设置菜单有意图,而不会在回来时显示任何活动

Flutter Firebase 消息传递 - 应用打开时未显示推送通知

如何通过单击 firebase 通知打开新活动并在 textview 上打印通知消息