在AppWidgetProvider
类中,我运行了一个简单的CountDownTimer
。
object : CountDownTimer(30000, 1000) {
override fun onTick(millisUntilFinished: Long) {
val appWidgetManager = AppWidgetManager.getInstance(context)
val views = RemoteViews(context.packageName,R.layout.view_group)
views.setTextViewText(R.id.m_text_view,"seconds remaining: " + millisUntilFinished / 1000)
appWidgetManager.updateAppWidget(appWidgetIds[0], views)
}
override fun onFinish() {
// Do nothing
}
}.start()
这会按照预期更新相应的小部件(appWidgetIds[0]
),但这只在应用程序打开时才会发生。当我在“最近”菜单中滑动应用程序,即关闭它时,小部件停止更新。
我也尝试过使用单独的服务,但结果相同。大概是因为该服务不是前台服务,而我不想有持久的通知,所以我不能使用前台服务。
发布于 2018-06-10 23:33:14
找到答案了。
在服务的
onStartCommand
方法上,返回START_STICKY
标志。这将告诉操作系统,如果由于任何原因服务关闭,当您有足够的资源时,再次运行它。
在重启时,您可以获取所有小部件ids,如下所示:
ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
编辑
请注意,在高于 23的安卓版本中,即使是 START_STICKY
标志也不足以让操作系统重新启动该服务。
我已经决定跳过这个功能,因为它不能在未来的版本中运行。
发布于 2018-06-10 22:16:25
当我在“最近”菜单中滑动应用程序,即关闭它时,小工具停止更新。
这通常会终止您的进程,此时您的CountDownTimer
将不复存在。
我也尝试过使用单独的服务,但结果相同
这不一定会阻止您的进程被终止,尽管它可能会帮助您更快地恢复进程。然而,在Android 8.0+上,你的服务会在一分钟后停止。
从电池消耗的角度来看,每隔30秒在后台工作是相当糟糕的,这就是为什么它在现代版本的Android上是不切实际的。
https://stackoverflow.com/questions/50784567
复制相似问题