TileService 是否被视为前台进程

Cil*_*nco 5 android android-service android-service-binding android-8.0-oreo

在 Android O 中,我们有一些新的背景限制。例如,我们只能通过该Context.registerReceiver方法注册隐式广播。当系统终止我们的进程时(例如由于内存不足),注册的接收器也将被销毁。

为了减少系统杀死我们的进程的机会,我们必须告诉系统该进程仍然在前台。根据文档,如果满足以下任一条件,则应用程序被视为位于前台:

  • 它有一个可见的活动,无论该活动是启动还是暂停。
  • 它有一个前台服务
  • 另一个前台应用程序通过绑定到其服务之一或使用其内容提供商之一来连接到该应用程序。例如,如果另一个应用程序绑定到该应用程序,则该应用程序位于前台:
    1. 壁纸服务
    2. 通知监听器
    3. 语音或文字服务

如果这些条件都不成立,则该应用程序将被视为在后台运行。

TileServiceAndroid N 中引入的(用于快速设置图块)怎么样?当我们在 mainfest 文件中注册 a TileServiceasACTIVE_TILE时,系统不会在每次磁贴变得可见时绑定服务(如本文所述,因此我们的服务在系统进程中绑定到另一个应用程序。

那么我的应用程序(只要将图块添加到快速设置窗格中)是否被视为前台应用程序?这会很好,因为我不需要使用这种方法发出持久通知,并且用户仍然可以在后台发送我的应用程序(通过删除磁贴)

Com*_*are 5

\n

那么我的应用程序(只要将图块添加到快速设置窗格中)是否被视为前台应用程序?

\n
\n

正常情况下不会。引用您链接到的文章:

\n
\n

值得注意的是,TileService当用户没有查看图块\xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8adon\xe2\x80\x99t 时,你的意志肯定会被解除绑定(并被销毁),假设您的服务将在onStartListening()/对方法之外保持活动状态onStopListening()

\n
\n

所以,大多数时候,你的服务会被解绑并被销毁。

\n
\n
\n

系统不会在每次磁贴变得可见时绑定服务(如本文所述)

\n
\n

我的猜测是您指的是这些段落:

\n
\n

在活动模式下,您的TileService仍将受到onTileAdded()onTileRemoved()(以及单击事件)的约束。但是,您\xe2\x80\x99 唯一一次获得回调onStartListening()是在调用静态TileService.requestListeningState()方法之后。然后,您\xe2\x80\x99将能够在收到回调之前更新您的图块一次onStopListening()。这使您能够在数据更改时轻松地一次性更新图块,无论图块是否可见。

\n

由于活动图块每次变得可见时都不必绑定\xe2\x80\x99,因此活动图块更有利于系统健康。构建活动图块意味着每次快速设置面板可见时系统需要绑定的进程更少。(当然,系统已经TileServices根据可用内存等限制了绑定量,但那时你\xe2\x80\x99已经接近内存抖动的边界\xe2\x80\x8a\xe2\x80\x94\xe2 \x80\x8 不是你想要的地方。)

\n
\n

我希望有某种超时机制:如果您调用requestListeningState(),然后在 X 秒内不更新图块,您将被调用onStopListening()。聆听状态不持久;它只存在一次更新。因此,系统应该及时更新。我将测试这个场景,如果 aTileService可以以这种方式无限期地绑定,我将提交一份错误报告,因为这会浪费系统资源。

\n