我为Android Wear开发了一些表盘(minSdkVersion = 21和targetSdkVersion = 23)并整合了Google Fit API for Android。
我想在背景中查看具有给定用户选择的时间间隔的拟合数据并将其传递回我的表盘。所以我创建了一个扩展Service类的服务,实现了SensorEventListener,GoogleApiClient ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener等,我使用Fitness API来读取拟合数据和心脏传感器数据。
然后我将值(Calories,Distance,Steps等)传递给watch face,这是一个扩展CanvasWatchFaceService的标准类,使用自定义BroadcastReceiver。
我想要实现的是在表盘中始终更新健身变量,以便当它离开环境或静音模式,因为用户与之交互时,我需要显示的数据已经存在,我只需要在这个时刻使用Fitness API在屏幕上绘制它,因为它可能需要几秒钟。
它有效。数据由表盘中的广播接收器接收,并且可变值被正确设置。我使用一个简单的canvas.drawText在屏幕上输出它们。我看到它们以交互模式更新(监视面部可见和活动),当然根据轮询时间间隔,甚至在调用onTimeTick时看到它们在环境模式下更新,如果我正在调试表面(通过usb或蓝牙)。
一旦断开调试器并且表盘进入环境模式,似乎广播接收器就会停止接收消息。
我做错了什么?我真的对此感到沮丧。
答案 0 :(得分:0)
Android OS将在完成处理后立即终止后台Service
;这是其生命周期的基础。您可以在the documentation中了解详情。
对于您的使用案例,您可能想要设置BroadcastReceiver
,并使用AlarmManager.setExactAndAllowWhileIdle()
以轮询间隔触发它。将此推送到BroadcastReceiver
子类中已有的WatchFaceService
可能是有意义的,或者您可能需要创建一个新的替换轮询Service
。
此外,我不知道您轮询的频率,但在手表睡眠时经常这样做可能会对电池寿命产生重大影响。只是要记住一些事情;当手表睡了一会儿时,你可能想要做一些像频率逐渐降低的事情。