【问题标题】:Android O: can we make a clock widget?Android O:我们可以做一个时钟小部件吗?
【发布时间】:2017-08-16 06:55:39
【问题描述】:

我们的应用中有一个时钟小部件。 小部件需要每分钟更新一次才能正确显示时间。

在 Android O 中,建议使用 JobScheduler 进行后台更新。 不幸的是,有一些限制。

  1. JobService 的定期更新不能在少于 15 分钟的间隔内被调用。
  2. JobService.onStartJob() 的时刻是不可预测的。我们可能会错过更新分钟数字的确切时刻(第 59 秒)。

在 O 之前,我们使用 Handler.postDelayed() 运行后台服务来更新小部件中的时间。 在O中后台服务可以被系统终止。

您建议如何在 Android O 中实现时钟小部件?

现在还可以吗?

【问题讨论】:

  • 知道为什么我的问题被否决了吗?
  • 试试 JobIntentService
  • 这是一个非常重要的问题。它不应该被否决
  • 感谢您的支持,卡森!
  • 是的,我对此表示赞同,因为这很重要....大多数时钟小部件使用旧技术,因为时钟小部件是 Android 中的第一代应用程序。现在谷歌迫使开发者向前迈出一步。但没有明确的指导解决方案。 JobIntentService、JobScheduler、JobDispatcher、ForegroundService via Notification...所有这些对于一个简单的时钟小部件来说似乎都是多余的。

标签: android widget android-jobscheduler


【解决方案1】:

使用“TextClock”小部件控件,RemoteView 功能支持它,它每分钟自行更新,无需使用那些花哨的 JobScheduler 作业。

这样的事情可以解决问题:

<LinearLayout
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextClock
        android:id="@+id/dateText"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:format12Hour="@string/date_text_format_12h"
        android:format24Hour="@string/date_text_format_24h"
        android:gravity="bottom|center_horizontal"
        android:textColor="@android:color/black"
        android:textSize="@dimen/date_text_size_default"/>

    <TextClock
        android:id="@+id/timeText"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:format12Hour="@string/time_text_format_12h"
        android:format24Hour="@string/time_text_format_24h"
        android:gravity="top|center_horizontal"
        android:textColor="@android:color/black"
        android:textSize="@dimen/time_text_size_default"
        android:textStyle="bold"/>

</LinearLayout>

【讨论】:

  • 我没想到解决方案如此简单。几周前,我们甚至联系了 Google 开发人员支持。他们仍然没有提供任何答案。非常感谢!
  • TextClock 小部件仅从 API 17 开始可用。
  • 此解决方案不适用于模拟时钟。有谁知道在 Android Oreo 中是否可以创建模拟时钟?
  • 我也想知道模拟时钟的解决方案。
  • 另一个问题是您不能在 TextClock 中使用不同的字体。除了使用 TextClock 还有其他解决方案吗?
【解决方案2】:

这是一个小部件;它不需要一直更新——只有当它可见时。为什么要在小部件未运行时浪费电池来跟踪当前时间?

当小部件变得可见时,查找当前时间并立即绘制它。此外,计算下一分钟的开始时间,并将延迟消息或 Runnable 发布到将在该时刻触发的处理程序。当该消息/Runnable 执行时,更新您的时间显示并在下一分钟开始重新发布消息/Runnable。

您还应该为警报管理器在当前时间更改时发出的Intent.ACTION_TIME_CHANGED 广播注册一个接收器;您需要重新计算您显示的时间以及响应该广播的下一次更新发生的时间。

【讨论】:

  • 那么,当小部件变得可见时它触发了什么事件?
  • 据我所知,无法检测到小部件何时可见。
  • 我同意。无法知道小部件是否可见,因此上述建议将不起作用。我也在寻找使时钟小部件在 Android O 中工作的解决方案。到目前为止还没有解决方案。
  • 甚至 ACTION_TIME_CHANGED 现在都免于广播
猜你喜欢
  • 2019-11-28
  • 2018-07-01
  • 1970-01-01
  • 2023-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多