每秒启动WakefulBroadcastReceiver

时间:2016-10-30 11:55:20

标签: android

我有一个带倒数计时器的小部件在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方法来更新小部件

谢谢!

1 个答案:

答案 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的某个未来版本中