Android版百度鹰眼SDK(测试版本2.1.15)在开启定位追踪时会开启com.baidu.trace.LBSTraceService的服务来完成后台的定位和上传数据功能,此时如果应用主Activity退出(用户自行关闭,或者被系统kill等情况)时,则需要在重启时检测是否已经开启了追踪服务并可以正确停止服务。按照官方文档的说明,这种情况下应该先通过startTrace()重新进行后台服务的绑定,可以收到“onTraceCallback: 10006, 服务已开启”的结果回调,但我的实际测试结果则是,后台服务运行的情况下,应用重启startTrace()不会收到任何回调!同时又做了几种其它情况下的服务开启关闭测试,结果如下:
在应用不退出重启的情况下,不管是用同样的Trace对象,还是每次都创建同样参数的新Trace对象,都可以顺利连续开启、关闭追踪服务。而在重启应用的状态下,检测到服务正在运行后,用新创建的同样参数的Trace对象尝试startTrace时会出现收不到任何回调的情况,而如果先在应用管理器中手动停止后台服务再startTrace就没问题。
在应用重启的情况下,重新new一样参数的Trace对象,然后调用stopTrace,这样得到的回调结果是“onStopTraceFailed: 11002, 服务未开启”,但此时getRunningServices确实能够查到正在运行的后台服务。又试了通过stopService的方式直接请求停止com.baidu.trace.LBSTraceService服务,此时返回的是true,但getRunningServices依然可以检测到服务正在运行。
附上测试用的检测后台服务运行状态的方法:
public boolean isTraceServiceRunning() { ActivityManager manager = (ActivityManager) getActivity().getSystemService(ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if ("com.baidu.trace.LBSTraceService".equals(service.service.getClassName())) { return true; } } return false; }
最后,在联系了官方后,得到了问题的解决方法:
有种情况可能会导致此种情况下,调用startTrace()没有回调:
调用startTrace()后,sdk会判断服务运行状态,如果服务正在运行,便会将状态信息传递给client,但如果此时client与service的连接还未建立,会导致消息发送失败。可以这样处理,调用startTrace(),休眠几秒钟(等client与service建立完绑定关系),再调用stopTrace()。
也就是说,在应用重启时如果检测到追踪服务正在运行,那么就startTrace一下,然后隔几秒再startTrace一下,这时就可以收到结果的回调了,后面再进行stopTrace的操作时也就没有问题了,示例如下:
if (isTraceServiceRunning()) { startTrace(); // 延迟到服务绑定成功后再次请求,避免收不到回调的问题 final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { startTrace(); } }, 1000); }
其实,按照官方的说法,判断后台服务运行的方式可以依赖于这个startTrace时的结果,如果是“服务已开启”,那就是后台追踪一直在运行,否则就是没有,但这样的话,如果服务没开启,就会导致服务开启一次,虽然可以再关闭,但显然这不是很合理的做法,而且逻辑会变得无意义的复杂,所以还是先通过getRunningServices的方式判断吧,希望未来版本可以完善这部分功能的设计。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。