我的目标是在仅 BLE 模式下订阅 Google Nearby Messages。当我的应用程序没有运行(在后台或手机重启后根本没有启动)时,我只想要低功耗的后台扫描。我只能在屏幕上的事件上进行扫描。当应用程序处于活动状态时,我想进行前景扫描,对找到和丢失的信标做出快速反应,主要是距离估计。
我现在正在做的是在对“BOOT_COMPLETED”意图做出反应的广播接收器中在后台(使用 PendingIntent)订阅。当我的应用程序在后台并且其他应用程序进行扫描时,我收到了一个意图。所以这部分有效。
现在,当我的 Activity 启动(onResume)时,我在前台模式下第二次订阅(使用 MessageListener 而不是 PendingIntent)。我取消订阅 onPause。我得到更新非常快,包括距离估计。所以这也有效。
该解决方案虽然存在一些问题。
- 当找到信标时,onFound 现在由 PendingIntent 和 MessageListener 调用。所以不是很好的性能解决方案。
- 当我在前台订阅时,我首先通过后台接收者收到所有消息的 onLost。在我收到后台和前台接收者的 onFound 之后。取消订阅呼叫也是如此。导致丑陋的闪烁和较低的性能......
- 电池消耗是巨大的。主要是在许多订阅/取消订阅周期之后。当手机根本不使用并因此在后台扫描时,我能够在夜间(大约 10 小时)完全放电。电池消耗屏幕显示 Google Play 服务是最大的电池消耗者(25%)。
问题:
- 有没有更好的方法如何在应用程序未运行时接收低功耗结果并在应用程序运行时进行主动前台扫描?
- 订阅如何运作?它们(后台和前台)在应用重新启动之间是否持续存在?或者我应该在每个应用程序启动时订阅?当我再次订阅而不取消订阅时会发生什么?
- 我在日志文件中看到附近对 Activity 的反应变得不活跃。Activity 变为非活动状态时是否会自动禁用前台订阅?再次激活时会自动启用吗?还是只是使用大量电池而没有任何附加价值?