2

我有一个前台任务,它显示一个通知栏,目的是使这个通知栏不可移动。通知的配置是:

Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("Notification")
                .setContentText("Notification for app")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContent(notificationView)
                .setOngoing(true)
                .build();

虽然应用了 setongoing(true),但在华为设备(Android 5.1.1)上可以删除通知。虽然它适用于三星 J3。

刷通知时,华为出现如下画面

在此处输入图像描述

我在华为设备上的 strava/endomondo 应用程序上看到的内容,在用户滑动删除通知后立即带回通知。

用户删除通知后如何将通知恢复到前台?

4

2 回答 2

1

最后,我已经能够在像 strava/endomondo 这样的华为设备上重新启动通知。

为了触发通知删除事件,我必须使用 setDeleteIntent 并传递接收者类的待处理意图。

Intent intent = new Intent(this, BootCompleteReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);

Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("Foreground Task")
                .setTicker("Notification")
                .setContent(notificationView)
                .setDeleteIntent(pendingIntent)   //the delete intent I used
                .setOngoing(true).build();

在接收器的 onReceive 方法上,我再次启动了前台服务

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, RTMForegroundService.class);
        context.startService(service);
    }

现在,每次用户滑动删除通知时,它都会重新开始。

于 2018-03-01T09:16:00.897 回答
1

@Sabid Habib 的答案是正确的,但它应该使用自定义本地广播,而不是使用系统级广播,如下面定义的以及一些优化

定义您的自定义广播接收器,并放置一个静态布尔值NotificationService.sEnabled以检查您所需的服务是否已经在运行,如果您不想不必要地启动服务,还可以进行其他检查,您还可以向服务发送布尔值notificationServiceIntent.putExtra(NotificationService.EXTRA_RUN_IN_FOREGROUND, true);以指示该服务只应重新启动前台通知而不是完全重新启动它onStartCommand

public class NotificationRemovalReceiver extends BroadcastReceiver {

public static final String FILTER_NOTIFICATION_REMOVED = "FILTER_NOTIFICATION_REMOVED";

@Override
public void onReceive(Context context, Intent intent) {
    if(NotificationService.sEnabled) {
       Intent notificationServiceIntent = new Intent(context, NotificationService.class);
          notificationServiceIntent.putExtra(NotificationService.EXTRA_RUN_IN_FOREGROUND, true);
          context.startService(notificationServiceIntent);
    }
}

}

添加此广播接收器以获取删除通知

Intent removeNotificationIntent = new Intent(NotificationRemovalReceiver.FILTER_NOTIFICATION_REMOVED);
    PendingIntent removeNotificationPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, removeNotificationIntent, 0);


    Notification mNotification = new NotificationCompat.Builder(this, getNotificationChannelId())
            .setContentTitle(title)
            .setContentText(text)
            .setSmallIcon(smallIcon)
            .setDeleteIntent(removeNotificationPendingIntent)
            .setContentIntent(pendingIntent).build();

    startForeground(NOTIFICATION_ID, mNotification);

在清单文件中定义您的接收器

<receiver android:name=".receivers.NotificationRemovalReceiver" >
    <intent-filter>
        <action android:name="FILTER_NOTIFICATION_REMOVED" >
        </action>
    </intent-filter>
</receiver>
于 2018-08-03T16:16:20.597 回答