关闭应用程序后,小组件停止更新

时间:2018-06-10 14:11:13

标签: android service widget

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]),但仅在应用程序打开时才会出现这种情况。当我在最近的菜单中刷掉应用程序时,即。关闭它,小部件停止更新。

我也试过使用单独的服务,但结果相同。可能是因为该服务不是前台服务,我不想持续通知,因此我无法使用前台服务。

2 个答案:

答案 0 :(得分:1)

  

当我在最近的菜单中刷掉应用程序时,即。关闭它,小部件停止更新。

这通常会终止您的流程,此时CountDownTimer不再存在。

  

我也试过使用单独的服务,但结果相同

这不一定会阻止您的流程被终止,但它可能会帮助您更快地恢复流程。但是,在Android 8.0+上,您的服务将在一分钟后停止。

从电池消耗的角度来看,在后台每30秒做一次工作是相当邪恶的,这就是为什么它在现代版Android上不切实际。

答案 1 :(得分:-1)

找到答案。

  

在服务的onStartCommand方法中,返回START_STICKY标志。这将告诉操作系统,如果服务因任何原因关闭,请在有足够资源时再次运行它。

source
more info

重新启动时,您可以按如下方式获取所有小部件ID:

ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

source

修改

您知道,在大于API 23的Android版本中,即使START_STICKY标志也不足以让操作系统重新启动服务。

我决定跳过此功能,因为它在未来的Android版本中无效。