【问题标题】:Same id for different notification不同通知的相同ID
【发布时间】:2018-05-15 15:52:07
【问题描述】:

我已经实现了一个处理通知的应用程序,它以编程方式设置,代码如下:

 public void setAlarm(Cell cell, Long timeStamp, String title, String message) {
    Integer id = (int) System.currentTimeMillis();
    Intent notificationIntent = new Intent(context, receiver);
    notificationIntent.putExtra("ID", id);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, notificationIntent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    assert alarmManager != null;
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeStamp, 2 * 60 * DateUtils.SEC_TO_MILLIS, pendingIntent);
    RepositoryManager repositoryManager = RepositoryManager.getInstance();
    repositoryManager.storeNotificationAdministration(new NotificationAdministration(id, timeStamp, 2, title, message, 1, null, cell, StatusNotification.NOT_YET_NOTIFIED.getId()));
}

这是我的接收器:

 @Override
public void onReceive(Context context, Intent intent) {
    RepositoryManager controllerDatabase = RepositoryManager.getInstance(ControllerDatabase.getInstance(context));
    NotificationMedicine notificationMedicine = controllerDatabase.getNotificationMedicine();
    if (notificationMedicine.getEnable()) {
        if (intent.hasExtra("ID")) {
            int id = intent.getIntExtra("ID", 0);
            NotificationManager mNotifyMgr =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            Log.d("DEBUG", "MyReceiverAdministration " + id);
            try {
                NotificationAdministration notificationAdministration = controllerDatabase.findNotificationAdministrationById(id);

                NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
                        .setSmallIcon(R.drawable.ic_medicine)
                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                        .setContentTitle(notificationAdministration.getTitle())
                        .setContentText(notificationAdministration.getMessage())
                        .setOngoing(false)
                        .setPriority(NotificationCompat.PRIORITY_HIGH)
                        .setAutoCancel(false);

                Intent i = new Intent(context, MainActivity.class);
                i.putExtra(SettingsData.TAG_CELL, notificationAdministration.getCell().getId());
                PendingIntent pendingIntent =
                        PendingIntent.getActivity(
                                context,
                                notificationAdministration.getId(),
                                i,
                                0
                        );
                Intent snoozeIntent = new Intent(context, MyFlagBroadcastReceiver.class);
                snoozeIntent.putExtra(SettingsData.TAG_CELL, notificationAdministration.getId());
                PendingIntent flagIt =
                        PendingIntent.getBroadcast(context, 0, snoozeIntent, 0);
                mBuilder.setLights(0x6098CF, 1000, 2000);
                Uri uriRingtone = notificationMedicine.getRingtone();
               mBuilder.setSound(uriRingtone);
                mBuilder.setContentIntent(pendingIntent);
                mBuilder.addAction(R.drawable.ic_timer_black_24dp, context.getString("Do my action"), flagIt);
                mNotifyMgr.notify(notificationAdministration.getId(), mBuilder.build());
                Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(700);
                notificationAdministration.setStatus(StatusNotification.NOTIFIED.getId());
                controllerDatabase.storeNotificationAdministration(notificationAdministration);
            } catch (ObjectNotFoundException e) {
                e.printStackTrace();
            }
            }
        }
    }
}

这是其他Receiver,当用户点击通知的动作时:

 RepositoryManager controllerDatabase = RepositoryManager.getInstance(ControllerDatabase.getInstance(context));
        if (intent.hasExtra(SettingsData.TAG_CELL)) {
            int id = intent.getIntExtra(SettingsData.TAG_CELL, 0);
try {
                NotificationAdministration notificationAdministration = controllerDatabase.findNotificationAdministrationById(id);
                Device device = controllerDatabase.getDefaultDeviceByUser(controllerDatabase.getLoggedUser().getUser());
                Cell cell = controllerDatabase.findCellById(device, notificationAdministration.getCell().getId());
                Calendar calendar = Calendar.getInstance();
                Long now = calendar.getTimeInMillis() / DateUtils.SEC_TO_MILLIS;
                controllerDatabase.flagMedicineTaken(cell, now);
                NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                if (mNotificationManager != null) {
                    mNotificationManager.cancel(id);
                }
            } catch (ObjectNotFoundException e) {
                e.printStackTrace();
            }
        }

我面临的问题是 MyFlagBoradcastReceiver 始终获得相同的通知 ID,而不是我正在按下/单击的那个。

该应用程序的想法是设置不同的通知,这些通知始终可见,直到用户单击通知的操作。警报也应在 2 分钟后触发...

** 更新 **

这是我应该用来取消警报的代码行;我应该使用什么作为接收器?

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent myIntent = new Intent(context,
                    receiver);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    context, notificationAdministration.getId(), myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            if (alarmManager != null) {
                alarmManager.cancel(pendingIntent);
            }

【问题讨论】:

    标签: android android-intent alarmmanager android-notifications android-pendingintent


    【解决方案1】:

    Notification 创建PendingIntent 时,您需要这样做:

    PendingIntent flagIt = PendingIntent.getBroadcast(context,
                             notificationAdministration.getId(),
                             snoozeIntent, 0);
    

    您需要确保为MyFlagBroadcastReceiver 创建的每个PendingIntent 都是唯一的,否则Android 将只返回现有的PendingIntent 而不会创建新的PendingIntent。为此,您可以为每次调用 PendingIntent.getBroadcast() 提供一个唯一 ID。

    【讨论】:

    • 感谢您的回复。现在情况好多了,顺便说一下,警报似乎在重复,即使我已经取消了它的挂起;正常吗?我哪里错了?
    • 您将闹钟设置为重复。发布您用于取消警报的代码(编辑您的原始帖子并在那里添加代码,请不要在此处添加代码作为评论),我会看看它。
    • 你只取消Notification。你永远不会取消闹钟。您需要调用 `AlarmManager.cancel() 来取消警报。
    • 谢谢!顺便说一句,我对您的提示有疑问;我应该使用什么作为接收器?事实是我只是想取消警报,而不是对其进行其他操作。我已经更新了帖子
    • 对不起,我不明白你的问题。你是什​​么意思“我应该用什么作为接收器”?您应该将您的取消代码添加到您要取消闹钟的地方。
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多