我有一个带倒数计时器的小部件在Android 4.1中运行良好。但是我尝试了5.1,它不再工作了。阅读博客和文档,这是Android版本的变化
这是我在AppWidgetProvider类中的onEnabled中的代码
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ 100 * 1, 1000 , pi);
}
我读到setRepeating不是更多的支持,我应该使用setExact或其他东西。它也没有用。
最好的解决方案是实现一个WakefulBroadcastReceiver,但我不知道如何每秒启动他的onRecive方法来更新小部件
谢谢!
答案 0 :(得分:2)
我有一个带倒数计时器的小部件在Android 4.1中运行良好
我真诚地希望这个计时器是为了简短的事情。每秒做一些事情是相当邪恶的,特别是当您的应用程序小部件大部分时间隐藏浩大的时。谷歌不得不采取措施阻止开发人员做这样的事情。
这是我在AppWidgetProvider类中的onEnabled中的代码
Google阻止开发人员执行此类操作的其中一项操作是在Android 5.1中添加未记录的更改,其中setRepeating()
cannot have a period of less than one minute。
我应该使用setExact或其他东西。它也没有用。
我认为您可以通过这种方式获得每五秒钟的粒度。它比setRepeating()
更好,但我不认为你可以达到每秒的粒度。
最佳解决方案是实施WakefulBroadcastReceiver
这不会解决您的问题。
您可以启动前台服务并使用一些进程内定时引擎(例如ScheduledExecutorService
)来获取每秒控制权并更新您的应用小部件。请记住:
您的服务不会永远存在
睡眠模式,打盹模式,应用待机等仍会阻止您的代码运行
如果谷歌采取措施阻止此类行为,我将不会感到震惊,在Android的某个未来版本中