【问题标题】:Launch WakefulBroadcastReceiver every second每秒启动 WakefulBroadcastReceiver
【发布时间】:2020-05-21 19:02:18
【问题描述】:

我有一个带有倒数计时器的小部件,在 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 但我不知道如何每秒启动他的 onReceive 方法来更新小部件。

【问题讨论】:

标签: android alarmmanager


【解决方案1】:

我有一个带有倒数计时器的小部件,在 Android 4.1 中运行良好

我真诚地希望这个计时器是短时间的。每秒钟都在做某事是相当邪恶的,尤其是当您的应用小部件大部分时间都隐藏时。 Google 不得不采取措施阻止开发者做这样的事情。

这是我在 AppWidgetProvider 类的 onEnabled 中的代码

Google 为阻止开发人员执行此类操作而采取的措施之一是在 Android 5.1 中添加了一个未记录的更改,其中setRepeating() cannot have a period of less than one minute

我应该使用 setExact 什么的。也没有用。

我认为您可以通过这种方式降低到每 5 秒的粒度。它比setRepeating() 好,但我认为你不能细化到每秒的粒度。

最好的解决方案是实现 WakefulBroadcastReceiver

这不会解决你的问题。

您可以启动前台服务并使用一些进程内计时引擎(例如,ScheduledExecutorService)来控制每秒并更新您的应用小部件。请记住:

  • 您的服务不会永远存在

  • 睡眠模式、打盹模式、应用待机等仍会阻止您的代码运行

  • 如果 Google 在未来的某些 Android 版本中也采取措施阻止此类行为,我不会感到震惊

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多