AlarmManager setRepeting无效

时间:2018-06-08 02:21:51

标签: android android-alarms

我想创建一个警报,每小时触发一次通知。

我的代码可以在我的模拟器android 8.0上运行,但在我的设备上它没有,我有一个3T的android 3。我允许在手机中使用我的应用程序来显示通知。

我在onCreate中这样做。

calendar = Calendar.getInstance();
intent = new Intent(this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am = (AlarmManager)this.getSystemService(ALARM_SERVICE);

am.cancel(pendingIntent);

这就是我在onDestroy

中所做的
protected void onDestroy()
{
    // telling the client thread to close
    c.setCommand(6);

    // setting an notification alarm every hour
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 60, pendingIntent);

    super.onDestroy();
}

更新

我发现当应用程序关闭时,AlarmManager没有触发我的通知,那么我是否需要使用设置AlaramManager的服务?

2 个答案:

答案 0 :(得分:0)

基于documentation

  

标准AlarmManager警报(包括setExact()和setWindow())   被推迟到下一个维护窗口。

     
      
  • 如果您需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。

  •   
  • 使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。

  •   

它正在您的模拟器上工作,因为您可能没有启用打盹模式进行测试。

如果您的用例不需要在特定时间触发,请考虑使用WorkManager

答案 1 :(得分:0)

要在Android 8.0中显示通知,您需要使用NotificationChannel,而无需定义通知通道,您无法显示任何来源的通知(在您的情况下使用AlarmManager)

for Android Version> 8.0(奥利奥)

// Setup a NotificationChannel
public static final String ALARM_CHANNEL_ID = "alarm";
public static final String ALARM_CHANNEL_NAME = "Alarm Channel";

NotificationChannel alarmNotificationChannel = new NotificationChannel(ALARM_CHANNEL_ID, ALARM_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
    String description = "Media playback controls";
    playNotificationChannel.setDescription(description);
    playNotificationChannel.setShowBadge(false);
    playNotificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
    getNotificationManager().createNotificationChannel(playNotificationChannel);

    notification = new Notification.Builder(context)
                                .SetChannelId(ALARM_CHANNEL_ID)
                                .SetContentTitle(title)
                                .SetContentText(message)
                                .SetAutoCancel(true)
                                .SetSmallIcon(Resource.Drawable.icon)
                                .SetContentIntent(pending)
                                .Build();
    //use the notification as you are already using it.
}