当我尝试使用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()设置的闹钟没有响起,我将是一个快乐的男孩.谢谢!!!
解决方法
这与setExact()完全不同,后者仅为您的应用设置程序化警报 – 用户无法看到.您可以使用adb shell dumpsys警报转储当前警报列表,以帮助调试警报是否已正确安排.