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

时间:2016-06-17 13:58:48

标签: android design-patterns google-play-services activity-recognition

我正在寻找实现这一目标的一般设计:

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

问题在于,使用新的ActivityRecognition API设计,它与GooglePlayServices客户端绑定,例如:

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

从逻辑上讲,如果创建它的Activity或Service被销毁,则该客户端将消失,导致任何ActivityRecognition更新丢失。

显然,如果我保持服务(或活动)存活,一切都会顺利进行,持续使用GooglePlayServices客户端来启动ActivityRecognition API(在此示例中为 myGoogleApiClient )......但这就是我想要的避免...

如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

最后,看起来GooglePlayServices的设计方式如下:我们需要通过后台活动或服务保持与GoogleApiClient的连接,即使这听起来有点奇怪,也许有一些很好的理由可以采取行动像这样。

答案 2 :(得分:0)

改为使用Activity Transition API。