为何长时间未显示通知

时间:2019-08-07 06:10:21

标签: android

当我将提醒时间设置为几分钟时,将显示一条通知。但是,如果时间超过一小时,则不会显示通知。

当我每隔24小时使用alarm.setRepeating时,效果很好,但我不想重复用户提醒。 如何解决?

AddReminder.java

Intent nIntent = new Intent(MainActivity.context, ReminderReceiver.class);
            nIntent.putExtra("ID", newID);
            nIntent.putExtra("TITTLE", getString(R.string.reminder));
            nIntent.putExtra("TEXT", name);
            PendingIntent alarmIntent = PendingIntent.getBroadcast(MainActivity.context, 0, nIntent, 0);
            AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

            date.set(Calendar.SECOND, 0);
            alarm.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), alarmIntent);

ReminderReceiver.java

@Override
    public void onReceive(Context context, Intent intent) {

        int notificationId = intent.getIntExtra("ID", 0);
        String message = intent.getStringExtra("TEXT");
        String tittle = intent.getStringExtra("TITTLE");

        Intent mainIntent = new Intent(context, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, mainIntent, 0);

        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification.Builder builder = new Notification.Builder(context);
        builder.setSmallIcon(R.drawable.finance43)
                .setContentTitle(tittle)
                .setContentText(message)
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(true)
                .setShowWhen(true)
                .setContentIntent(contentIntent)
                .setPriority(Notification.PRIORITY_HIGH)
                .setCategory(Notification.CATEGORY_MESSAGE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String channelId = "REMINDERS";
            NotificationChannel channel = new NotificationChannel(channelId,
                    context.getResources().getString(R.string.reminders),
                    NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(channel);
            builder.setChannelId(channelId);
        }
        notificationManager.notify(notificationId, builder.build());

    }

1 个答案:

答案 0 :(得分:2)

您需要考虑以下几点:

1。您可能无意中将其取消了

AlarmManager.set的文档规定以下内容:

  

如果已经为同一个IntentSender安排了警报,则该先前的警报将首先被取消

这意味着,如果在设置警报后用意图和未决意图的相同组合设置了另一个警报,则先前的警报将被取消。确保您的意图是唯一的,除非您打算“替换”现有警报

2。该警报不准确

使用AlarmManager.setAlarmManager.setInexactRepeating方法(可能还有更多方法)来配置不精确的警报。不精确的警报不一定会在您期望的确切时间触发。如文档中所述,此行为是在API级别19中引入的:

  

从API 19开始,传递给此方法的触发时间被视为不准确:警报不会在此时间之前发送,但是可能会延迟并在以后的某个时间发送

如果要在请求时准确触发警报,请使用setExact

3。警报已被系统取消

当系统关闭时,所有警报将被取消。换句话说,如果重新启动或关闭设备电源,警报也会被取消。重复发出警报是一个例外,一旦设备启动,它们就会全部触发。

请确保您跟踪正在运行的警报,然后注册BroadCastReceiver以收听系统发出的android.intent.action.BOOT_COMPLETED广播并重新启动警报

4。设备处于空闲/打ze模式

使用set设置警报将导致该警报在设备“打zing” /空闲时不触发。尽可能使用setAndAllowWhileIdlesetExactAndAllowWhileIdle(我认为是API级别23中引入的)

5。更改设备的时区/语言环境

使用实时时钟(RTC)警报时,这可能会导致意外结果,因为该应用程序可能会很好地转换为其他语言环境。已过去的实时警报比RTC警报具有更好的伸缩性