在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]
),但仅在应用程序打开时才会出现这种情况。当我在最近的菜单中刷掉应用程序时,即。关闭它,小部件停止更新。
我也试过使用单独的服务,但结果相同。可能是因为该服务不是前台服务,我不想持续通知,因此我无法使用前台服务。
答案 0 :(得分:1)
当我在最近的菜单中刷掉应用程序时,即。关闭它,小部件停止更新。
这通常会终止您的流程,此时CountDownTimer
不再存在。
我也试过使用单独的服务,但结果相同
这不一定会阻止您的流程被终止,但它可能会帮助您更快地恢复流程。但是,在Android 8.0+上,您的服务将在一分钟后停止。
从电池消耗的角度来看,在后台每30秒做一次工作是相当邪恶的,这就是为什么它在现代版Android上不切实际。
答案 1 :(得分:-1)
找到答案。
在服务的
onStartCommand
方法中,返回START_STICKY
标志。这将告诉操作系统,如果服务因任何原因关闭,请在有足够资源时再次运行它。
重新启动时,您可以按如下方式获取所有小部件ID:
ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
修改强>
您知道,在大于API 23的Android版本中,即使START_STICKY
标志也不足以让操作系统重新启动服务。
我决定跳过此功能,因为它在未来的Android版本中无效。