代码之家  ›  专栏  ›  技术社区  ›  olfek

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

  •  0
  • olfek  · 技术社区  · 6 年前

    在一个 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] )如预期,但这只是在应用程序打开时的情况。当我在Recents菜单中刷掉应用程序,即关闭它时,小部件停止更新。

    我也试过使用单独的服务,但结果是一样的。大概是因为服务不是前台服务,我不希望有持久的通知,所以我不能使用前台服务。

    2 回复  |  直到 6 年前
        1
  •  1
  •   CommonsWare    6 年前

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

    通常会终止进程,此时 CountDownTimer 不再存在。

    我也试过使用单独的服务,但结果是一样的

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

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

        2
  •  -1
  •   olfek    6 年前

    找到了答案。

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

    source
    more info

    在重新启动时,您可以获得以下所有小部件ID:

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

    source

    编辑

    正如你所知,在比API23更高的Android版本中,甚至 斯塔克粘性 标志不足以让操作系统重新启动服务。

    我决定跳过这个功能,因为它在未来的android版本中不起作用。