在应用处于非活动状态时处理 ActivityRecognition.API 个意图

Handling ActivityRecognition.API intents while app is inactive

我正在寻找实现这个的通用设计:

我想注册 ActivityRecognition API 以接收此 API 不时调用的 IntentService 中的定期更新,而我的应用程序中的其他所有内容都完全不活动(此处的目标是避免耗尽设备上过多的电池电量)。

问题在于新的 ActivityRecognition API 设计与 GooglePlayServices 客户端相关联,例如:

ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(
    myGoogleApiClient, 
    3000L, 
    myActivityRecognitionPendingIntent);

从逻辑上讲,如果 Activity 或创建它的服务被销毁,则此客户端会消失,从而导致任何 Activity 识别更新丢失。

显然,如果我保持服务(或 Activity)处于活动状态,并且持续保持用于启动 Activity识别的 GooglePlayServices 客户端 API(myGoogleApiClient 在这个例子中)......但这是我想要避免的......

如何实现?

您可以查看警报管理器和那里的权衡,请参阅 https://developer.android.com/training/scheduling/alarms.html

如果 API 仅在适当的时间自动唤醒,更有效的解决方案是尝试广播接收器。如果您要求设备保持唤醒状态,您应该查看 https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html

经过进一步测试并使用更新后的 GooglePlayServices (9.0.2),这看起来是一项不可能完成的任务。 我通过创建一个始终处于后台并只做 一件事的粘性服务解决了这个问题:保持 GoogleApiClient 连接处于活动状态。希望这不会消耗太多电量……

不这样做,杀死处理 GoogleApiClient 的东西会导致奇怪和不一致的错误和行为,具体取决于 Android 版本和设备 运行 它:30% 的时间它工作正常,否则应用程序崩溃,所以绝对不可靠。

最后,GooglePlayServices 似乎是这样设计的:我们需要使用后台 activity 或服务保持与 GoogleApiClient 的连接,即使这听起来有点奇怪,也有也许有一些很好的理由这样做。

改用Activity过渡API。