1

在Android O中,我们有一些新的background limitations。例如,我们只能通过Context.registerReceiver方法注册隐式广播。当系统杀死我们的进程时(例如由于内存不足),注册的接收器也将被销毁。TileService被视为前台进程

为了减少系统杀死我们进程的机会,我们必须告诉系统这个过程仍然处于前台。按照documentation一个应用程序被认为是在前台如有下列情况为真:

  • 它有一个明显的活动,该活动是否已启动或暂停。
  • 它有一个前台服务
  • 另一个前台应用程序通过绑定到其中一个服务或通过使用其中一个内容提供程序连接到应用程序。例如,应用程序是在前台,如果另一个应用程序绑定到其:
    1. IME
    2. 壁纸服务
    3. 通知监听
    4. 语音或文本服务

如果这些条件都不是真的,则应用程序被认为是在后台。

那么在Android N中引入的TileService(用于快速设置瓷砖)呢?当我们在mainfest文件中注册TileServiceACTIVE_TILE时,系统在每次可见图块时都不绑定服务(如此article中所述),因此我们的服务绑定到另一个应用程序,面对系统进程。

那么我的应用程序(只要将图块添加到快速设置窗格中)视为前景应用程序?这将是很好的,因为我不需要这种方法的持续通知,但用户可以在后台发送我的应用程序(通过删除瓦片)

回答

1

所以是我的应用程序(只要该图块被添加到快速设置窗格)被视为前台应用程序?

不正常。引用你链接到相应的文章: - 不要以为你的服务一定会健在

请注意,您TileService将主要肯定是绑定(和销毁),当用户不在观看瓷砖是非常重要的在onStartListening()/onStopListening()之外的一对方法。

因此,大多数情况下,您的服务将被解除绑定并销毁。


系统不会每次(如本文中提到的)瓷砖变得可见时间

我的猜测是,你指的是这些段落绑定服务

在活动模式下,您的TileService仍将绑定为onTileAdded()onTileRemoved()(以及点击事件)。但是,只有在您拨打TileService.requestListeningState()静态方法后,才能回拨到onStartListening()。在收到onStopListening()的回调之前,您将可以更新您的瓷砖一次。这使您可以轻松实现一次性更新,无论瓷砖是否可见,数据更改时都可以更新瓷砖。

由于每当瓦片变得可见时活动瓦片不必被绑定,活动瓦片对系统健康状况更好。构建活动拼贴意味着每次快速设置面板变得可见时系统需要绑定的进程就会减少。 (当然,该系统已经限制了基于可用内存等结合TileServices量,但那时你已经存储器中颠簸的边境附近 - 不是你想成为)

我会预计会出现某种超时机制:如果您拨打requestListeningState(),则不要在X秒内更新磁贴,否则将拨打onStopListening()。听音状态不耐用;它只能用于一次更新。所以,系统应该及时地预测更新。如果TileService可以以这种方式无限期地绑定,我将测试这个场景并提交一个错误报告,因为这是对系统资源的浪费。

+0

很好的答案,谢谢你! – Cilenco

相关问题