AlarmManager.AlarmClockinfo.getNextAlarmClock()导致NullPointerException

mor*_*tic 3 java android

问题

当我尝试将AlarmManager.AlarmClockInfo对象用于getNextAlarmClock()我的应用程序时抛出:Attempt to invoke virtual method 'long android.app.AlarmManager$AlarmClockInfo.getNextAlarmClock()' on a null object reference

我的守则

我的代码的相关部分......

public class MyAppWidget extends AppWidgetProvider {

    private PendingIntent my_svc = null;

    public void onUpdate(Context c, AppWidgetManager awm, int[] appWidgetIds) {

        final AlarmManager m = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
        final Calendar alarm_time = Calendar.getInstance();
        final Intent i = new Intent(c, MyService.class);

        // set alarm for 2015-Jul-7 10:35:55 AM
        alarm_time.setStime(new Date(2015,7,7,10,35,55));

        // set up the service if necessary
        if ( my_svc == null ) {
            my_svc = PendingIntent.getService(c, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
        }

        // set the alarm
        m.setExact(AlarmManager.RTC, alarm_time.getTime().getTime(), my_service);

        // now write a log message to confirm the alarm was set
        // **THIS IS THE CODE THAT THROWS THE EXCEPTION**
        AlarmManager.AlarmClockInfo aci = m.getNextAlarmClock();
        Log.v("MyAppWidget", "next alarm at: " + aci.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

背景资料

我正在为Android开发一个家庭/锁屏小部件应用程序.小部件中的信息需要在非特定时间更新,而不是在OS广播APPWIDGET_UPDATE操作时.我成功地按照本教程使用AlarmManager在特定时间更新小部件,并且能够使用该AlarmManager.setRepeating()函数每分钟更新一次小部件.

但是,我不需要每分钟更新一次窗口小部件,而是每隔2-3天在特定时间更新一次.所以我尝试使用AlarmManager.setExact()而不是setRepeating().该应用程序编译没有错误,似乎运行正常,但小部件不会更新,当我认为它应该.我已经确认正在向setExact()函数提交正确的时间,但由于更新未按计划进行,我想查看警报是否确实已设置.那是我尝试使用getNextAlarmClock()并开始遇到这些问题的时候.

应用程序/仿真器规范

应用程序:

  • minSdkVersion:21
  • targetSdkVersion:22

仿真器:

  • 名称:Nexus 5 API 22
  • CPU/ABI:Google API的Intel Atom(x86)
  • 目标:Google API(API级别22)
  • SD卡:100M
  • 启用GPU:是的
  • RAM大小:2GB

我尝试过的事情

  • 记录alarm_time.getTime().toString以确认我正在设置正确的闹钟时间
  • 确认报警的时间是将来的(通过在仿真器上手动设置时间)
  • 这个SO线程建议的解决方案
  • getNextAlarmClock()包含使用已弃用常量的变体,getTriggerTime()以及m.getNextAlarmClock().toString()

我完全被这个难过了.如果您对我为何无法获得有关下一组警报的信息有任何想法,或者为什么我的警报设置setExact()没有消失,我将是一个快乐的男孩.谢谢!!!

ian*_*ake 8

AlarmClock并且AlarmManager是两个完全不同的东西:闹钟由Clock应用程序和其他应用程序通过setAlarmClock()设置,适合唤醒用户,并且整个系统的用户都可以看到(取决于Android的制造商和版本).

这与完全不同setExact(),它只为您的应用程序设置程序化警报 - 用户无法看到.您可以使用adb shell dumpsys alarm转储当前警报列表来帮助调试警报是否已正确安排.