为啥挂起的意图在从服务的通知中调用时不会启动活动

Posted

技术标签:

【中文标题】为啥挂起的意图在从服务的通知中调用时不会启动活动【英文标题】:Why a pending intent does not start an activity when called form a service's notification为什么挂起的意图在从服务的通知中调用时不会启动活动 【发布时间】:2020-09-07 21:44:33 【问题描述】:

在我的 Github 帐户上,我做了一个简单的项目来描述我的问题here my project

我的主活动有一个按钮,其 onClick 方法调用后台服务。 Backgroundservice 等待 5 秒,然后触发通知。

这里是BackgroundService的代码(你可以在Github找到

@Override
    protected void onHandleIntent(Intent intent) //methode appelée en arrière plan
        if (intent != null) 

            try
                Thread.sleep(5000);
             catch (Exception e)
                e.printStackTrace();
            

            mNotificationsManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            CharSequence tickerText = "view hike";
            Intent intentReceiverAcctivity = new Intent(TAG_INTENT);
            intentReceiverAcctivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(this,0, intentReceiverAcctivity, 0);

            Notification.Builder builder = new Notification.Builder(this);

            builder.setAutoCancel(false);
            builder.setTicker(tickerText);
            builder.setContentTitle("The Hike");
            builder.setContentText("HikeMap is available");
            builder.setSmallIcon(R.drawable.explore);
            Bitmap large_icon_bmp = BitmapFactory.decodeResource(this.getResources(),
                    R.drawable.ic_action_map);
            builder.setLargeIcon(large_icon_bmp);
            builder.setContentIntent(pendingIntent);
            builder.setOngoing(true);
            builder.setSubText("Click on this icon to access the Hike's map");   //API level 16
            builder.setNumber(5000); //durée d'apparition de l'icone dans la barre de notifications ?
            builder.build();

            Notification notification = builder.getNotification();
            mNotificationsManager.notify(11, notification);

        
    

展开通知栏并单击 large_icon 应该会启动第二个名为 ReceiverActivity 的 Activity,其唯一目的是显示不同的消息。

在模拟器上,小图标出现在通知栏上,当我展开该栏时,我可以看到大图标,但单击它不会触发 ReceiverActivity

在我的智能手机上,通知栏上没有小图标,扩展通知区域上没有大图标...

知道服务代码出了什么问题吗? 这个小例子的完整代码可以在GitHub...上找到。

提前感谢您的帮助!!!

【问题讨论】:

【参考方案1】:

意图intentReceiverActivity = new Intent(TAG_INTENT);

public final static String TAG_INTENT = "NotificationClicked";

抱歉,您没有设置要运行的活动。您应该使用带有两个参数的 Intent,例如

Intent intent = new Intent(Context, YourActivity.class);

这是NotificationChannel的示例

    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationCompat.Builder builder = null;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
        NotificationChannel channel = new NotificationChannel(
                "channel_id",
                "channel_name",
                NotificationManager.IMPORTANCE_DEFAULT
        );
        channel.setDescription("channel_description");
        channel.setImportance(NotificationManager.IMPORTANCE_HIGH);
        manager.createNotificationChannel(channel);
        builder = new NotificationCompat.Builder(context, "channel_id");
     else 
        builder = new NotificationCompat.Builder(context);
        builder.setPriority(NotificationCompat.PRIORITY_HIGH);
    

【讨论】:

是的,设置要运行的活动可以在模拟器上运行,但是当我按下点击按钮时,真实设备上什么也没有发生,根本没有通知 你测试哪个 api? Api >= 26 需要将NotificationChannel 设置为通知。 我的智能手机在 API 28 (android 9) 上运行,模拟器只有 API19。你能给我一个关于如何设置通知频道的例子吗?谢谢 非常感谢。我跟着that android developper video 得到了同样的结果。但我会以你的编辑为基础!!!

以上是关于为啥挂起的意图在从服务的通知中调用时不会启动活动的主要内容,如果未能解决你的问题,请参考以下文章

单击 FCM 通知时,Flutter Notification 挂起的意图被取消

putExtra 使用挂起的意图不起作用

如何以挂起的意图启动 Activity 并清除所有后台堆栈?

取消挂起的推送通知

为啥 setOnClickPendingIntent 不起作用?

启动相机意图时未调用 onActivityResult?