在Android O中,我们有一些新的background limitations。例如,我们只能通过Context.registerReceiver
方法注册隐式广播。当系统终止我们的进程(例如由于内存不足)时,注册的接收器也将被销毁。
为了减少系统终止我们的进程的机会,我们必须告诉系统该进程仍在前台。根据documentation,如果满足以下任一条件,则认为该应用程序位于前台:
它具有可见的活动,无论该活动是开始还是暂停。
它具有前台服务
另一个前台应用程序通过绑定到其服务之一或通过使用其内容提供商之一而连接到该应用程序。例如,如果另一个应用绑定到该应用,则该应用位于前台:
我
墙纸服务
通知侦听器
语音或文字服务
如果所有这些条件都不成立,则认为该应用程序处于后台。
Android N中引入的TileService
(用于快速设置磁贴)怎么样?当我们在mainfest文件中将TileService
注册为ACTIVE_TILE
时,系统不会在每次图块变得可见时都绑定服务(如此article中所述),因此我们的服务将绑定到另一个应用程序。系统过程。
那么我的应用程序(只要将磁贴添加到快速设置窗格中)是否被视为前台应用程序?这样做会很不错,因为我不需要使用这种方法发出持久通知,但是用户仍然可以在后台发送我的应用(通过删除图块)
最佳答案
那么我的应用程序(只要将磁贴添加到快速设置窗格中)是否被视为前台应用程序?
不正常。引用链接到的文章:
重要的是要注意,当用户不查看图块时,您的TileService
在大多数情况下肯定是未绑定的(并已销毁)-不要假设您的服务在onStartListening()
/ onStopListening()
对之外仍然有效方法。
因此,在大多数情况下,您的服务将不受限制并被破坏。
每当磁贴变为可见时,系统都不会绑定服务(如本文所述)
我的猜测是您指的是这些段落:
在活动模式下,您的TileService
仍将绑定到onTileAdded()
和onTileRemoved()
(以及单击事件)。但是,只有在调用静态onStartListening()
方法之后,您才会获得对TileService.requestListeningState()
的回调。这样,您就可以只更新一次磁贴,然后接收到onStopListening()
的回调。无论数据是否可见,这都使您轻松地一口气就可以在数据更改时立即更新图块。
由于不必在每次显示时都绑定活动图块,因此活动图块对于系统健康而言更好。构建活动磁贴意味着每次快速设置面板都可见时,系统需要绑定的进程更少。 (当然,系统已经根据可用内存等限制了绑定的TileServices
数量,但是到那时,您已经接近内存崩溃的边界了-不在您想要的位置。)
我希望会有某种超时机制:如果您调用requestListeningState()
,那么不要在X秒内更新磁贴,那么就会使用onStopListening()
进行调用。监听状态不持久;它只能生存一次更新。因此,系统应该期望及时进行更新。如果可以无限期地绑定TileService
,我将测试这种情况并提交错误报告,因为这浪费了系统资源。