java – AlarmManager.AlarmClockinfo.getNextAlarmClock()导致NullPointerException

问题

当我尝试使用AlarmManager.AlarmClockInfo对象getNextAlarmClock()我的应用程序抛出:尝试在空对象引用上调用方法’long android.app.AlarmManager $AlarmClockInfo.getNextAlarmClock()’

我的守则

我的代码的相关部分……

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,10,35,55));

        // set up the service if necessary
        if ( my_svc == null ) {
            my_svc = PendingIntent.getService(c,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());
    }
}

背景资料

我正在为Android开发一个家庭/锁屏小部件应用程序.小部件中的信息需要在非常特定的时间更新,而不是在OS广播APPWIDGET_UPDATE操作时.我成功地遵循了this tutorial on using AlarmManager to update widgets at specific times,并且能够使用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以确认我正在设置正确的闹钟时间
>确认警报的时间是将来(通过在模拟器上手动设置时间)
> Solutions suggested by this SO thread
> getNextAlarmClock()的变体,包括使用不推荐的常量,getTriggerTime()和m.getNextAlarmClock().toString()

我完全被这个难过了.如果你有任何想法为什么我无法获得有关下一个设置闹钟的信息,或者为什么我用setExact()设置的闹钟没有响起,我将是一个快乐的男孩.谢谢!!!

解决方法

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

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

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...