带有按钮的 Android 前台服务通知

Posted

技术标签:

【中文标题】带有按钮的 Android 前台服务通知【英文标题】:Android foreground service notification with buttons 【发布时间】:2021-12-07 14:27:27 【问题描述】:

我正在尝试在前台服务通知中添加 3 个按钮,但我遵循的所有指南都失败了

这个答案说要添加操作:https://***.com/a/49539463/5679560 本教程说要使用 remoteview https://developer.android.com/training/notify-user/custom-notification

我已经尝试了这两个选项,但我的通知保持默认外观,即使文本根本没有改变,我的通知是指前台服务通知这是问题吗?前台服务通知中不能加个小按钮吗?

@Override
public int onStartCommand(Intent intent, int flags, int startId) 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this))
        startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + this.getPackageName())).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

    else if (intent.hasExtra(com.tomatedigital.androidutils.Constants.Intent.WINDOW_SERVICE_LAYOUT)) 
        new FloatingWindow(this, LayoutInflater.from(this).inflate(intent.getIntExtra(Constants.Intent.WINDOW_SERVICE_LAYOUT, 0), null), "casa");
        startForeground(1, Notification.startFloatingWindow(this));
    

    return START_REDELIVER_INTENT;


  public static android.app.Notification startFloatingWindow(@NonNull final Context context) 


        @SuppressLint("RemoteViewLayout") RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_floating_window);

        //HelperActivity will be shown at step 4
/*
        Intent stop = new Intent(context, MeuServico.class);
        stop.putExtra("stop", "do");//if necessary

        PendingIntent pRadio = PendingIntent.getActivity(ctx, 0, radio, 0);
        //R.id.radio is a button from the layout which is created at step 2  view.setOnClickPendingIntent(R.id.radio, pRadio);

        //Follows exactly my code!
        Intent volume = new Intent(ctx, tsapalos11598712.bill3050.shortcuts.helper.HelperActivity.class);
        volume.putExtra("DO", "volume");</p >

                //HERE is the whole trick. Look at pVolume. I used 1 instead of 0.
                PendingIntent pVolume = PendingIntent.getActivity(ctx, 1, volume, 0);
        view.setOnClickPendingIntent(R.id.volume, pVolume);
*/
        return new NotificationCompat.Builder(context, Constants.Notification.FLOATING_WINDOW_NID)
                //       .setSmallIcon(R.drawable.ic_notification_logo)
                .setContentTitle("getString(R.string.foregroundNotification)")
                .setContentText("text")
                //.setCustomContentView(contentView)
                .addAction(R.drawable.ic_stop, "teste", null)
                .setPriority(NotificationCompat.PRIORITY_LOW).build();
    

这个问题的更多背景。我正在尝试创建一个浮动窗口并让服务控制它。一切运行良好,服务启动 -> 进入前台 -> 创建浮动窗口,即使应用程序处于后台也能正常显示

但我想在通知中添加一个关闭按钮,以便用户可以关闭浮动窗口...

顺便说一句,浮动窗口中的文本显示“我的应用正在运行,点击此处查看更多信息”,这绝对不是我为通知编写的内容

【问题讨论】:

你为什么注释掉?? 因为在写这个问题之前我已经尝试了几种组合来试图找到错误,所以我只是在这里复制了最后一个代码 【参考方案1】:

显示这样的通知:

  NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL);
  builder.setContentTitle("Alarm for: " + (is24 ? _24H : _12H) + (isSnoozeAction ? " (Snoozed)" : ""))
         .setContentText(alarmLabel)
         .setSmallIcon(R.drawable.ic_n_alarm)
         .setColor(ContextCompat.getColor(context, R.color.colorPrimaryDark))
         .setContentIntent(pi)
         .addAction(new NotificationCompat.Action(R.drawable.ic_n_snooze, "Snooze", actionSnooze))
         .addAction(new NotificationCompat.Action(R.drawable.ic_n_cancel, "Dismiss", actionDismiss));

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

addAction在通知中添加一个按钮,传递的第三个参数是PendingIntent,代表实际动作。

PendingIntent actionDismiss = PendingIntent.getBroadcast(context, 113, receiverDismiss,
                                                               PendingIntent.FLAG_ONE_SHOT);

PendingIntent actionSnooze = PendingIntent.getBroadcast(context, 114, receiverSnooze,
                                                              PendingIntent.FLAG_ONE_SHOT);

【讨论】:

你的答案是错误的,图标不会显示很简单,因为 android 已经删除它并且没有记录任何文件,我在这里找到了另一个话题和解决方法 我什至无法理解您的代码。这不是我的错,我的回答是错误的。完成后更新问题以及您如何解决问题,以便人们也可以看到它

以上是关于带有按钮的 Android 前台服务通知的主要内容,如果未能解决你的问题,请参考以下文章

Android 在前台服务中丢失 websocket 连接

API 级别 24 中的前台服务 - Android 7.0 Nougat

Android:如何从活动活动中关闭前台活动?

Android 使用前台服务

如何在没有服务运行通知的情况下在android前台服务中设置通知接收器......如Whatsapp和Telegram?

无法从服务启动前台通知?