0

我想发送定时通知(每天早上 5:00),并尝试使用 AlarmManager 和以下代码来做到这一点:

Intent appIntent = new Intent(this, NotificationService.class);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        PendingIntent penIntent = PendingIntent.getService(this, 0,
                appIntent, 0);

        alarmManager.cancel(penIntent);

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 5);
        cal.set(Calendar.MINUTE, 00);
        cal.set(Calendar.SECOND, 00);

        alarmManager.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, penIntent);

NotificationService.class 看起来(至少是重要部分)如下所示:

int id = 001;

            NotificationManager mNotifyMng = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                    MainActivity.this).setSmallIcon(R.drawable.icon).setContentTitle("Test")
                    .setContentText("Test!");

            mNotifyMng.notify(id, mBuilder.build());
            stopSelf();

我似乎无法让它工作。当我将模拟器时钟设置为 4:59 或其他时间并等待它更改为 5:00 时,没有出现任何通知,我想不出另一种方法来测试它。我希望你知道一些方法来测试它或在我的代码中找到错误。

4

1 回答 1

0

我相信问题是你取消了,PendingIntent但是你需要在设置之前重新创建它alarmManager

  //cancel pendingIntent
  AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
  PendingIntent penIntent = PendingIntent.getService(this, 0,appIntent, 0);   
  alarmManager.cancel(penIntent);

  //reset pendingIntent
  Intent appIntent = new Intent(this, NotificationService.class);
  AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
  PendingIntent penIntent = PendingIntent.getService(this, 0,appIntent, 0);  
  Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 5);
    cal.set(Calendar.MINUTE, 00);
    cal.set(Calendar.SECOND, 00);

    alarmManager.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(),                                                                      
          AlarmManager.INTERVAL_DAY, penIntent);  

要取消 a PendingIntent,您需要像第一次一样创建它,然后按原样调用AlarmManagers cancel()。但随后您需要再次创建它以在PendingIntent

**我希望你知道一些测试方法...

可能有更好的方法,但出于测试目的,我有时会设置一个全局调试标志,它会改变测试和生产之间的时间。所以说4小时可能是2分钟。一天中的时间可能有点棘手,但您可以将时间更改为任何小时、分钟或任何接近的时间。一旦您知道它在正确的时间触发,那么您可以将其更改回来并在一天中的那个时间到来时仍然进行测试,但您现在知道它应该可以工作。

于 2013-03-26T18:46:33.673 回答