前人栽树,后人乘凉。理解Service后台进行百度定位。

来源:互联网 发布:centos设置语言为中文 编辑:程序博客网 时间:2024/04/27 19:22

今天又逛了android_ls 大神的博客。于是乎找了一篇博文跟着练习。  传送门:http://blog.csdn.net/android_ls/article/details/10179013

标题:基于百度定位SDK的定位服务的实现。

具体内容:分析应用需求---绘制UML图纸---构建代码框架---写代码创建Service后台进行百度定位。

感想: 发现大神们的UML图都画的很好。自己也尝试着绘制,但是确实困难重重。明明很简单的流程结构,但就是很难真正的理解所有的细节。所有自己独自绘制的时候就会出现卡壳的困难。

所用到的知识要点:

1.Service的理解。包括理解Service的生命周期。绑定方法。startService与bindService的区别,这两者混合使用后的不同结果。

2.截取开关机广播。添加两个全局Receiver,分别截取开机广播和关机广播。然后启动/关闭 Service

3.百度定位SDK的调用。具体的实现百度官方有Demo,不同版本有细微差别。 注意:需要注册百度定位服务“com.baidu.location.f”,其实这个服务里面获取定位信息,然后将信息传递给定位客户端mLocationClient,然后回调给定位监听器---一个自定义的定位监听器(实现BDLocationListener接口)。最终就可以通过Handler将信息从子线程传给自己的Service,最后还可以通过IPC通信(或者AIDL)将信息传给自己的客户端。

4.通过Handler进行子线程与UI线程的信息交互。主要是子线程持有UI线程的一个Handler句柄,然后通过往消息池中添加Messenger,主线程再从消息池中获取Messenger。这样就达到了线程之间的交互作用。

5.Handler的理解: 说实话,虽然会用,也用了很多次Handler交互方式,但是对于Handler究竟是什么东西,还是有些模糊。首先的清楚Handler,Looper,MessageQueue的关系。还得确定一个进程可以包括多个线程。

    5.1Android系统中Looper负责管理线程的消息队列和消息循环。 可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。一个线程可以存在一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。

但是创建的工作线程默认是没有消息循环和消息队列的(除了UI线程有一个MainLooper),如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。

    5.2MessageQueue是一个消息队列,用来存放Message(单个消息)。

    5.3Handler主要用于异步消息的处理,可以这样理解。Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。当一个Handler对象以主线程的Looper创建,这个主Handler包含了两个队列,一个是线程队列,另外一个是消息队列。使用post方法会将线程对象放到该handler的线程队列中(所以相当于在UI线程中执行了子线程),使用sendMessage(Message message)将消息放到消息队列中。这样,子线程通过得到主Handler句柄,然后将消息放入消息队列中,然后主线程也可以痛过主Handler从消息队列中得到消息。这样就达到了线程之间的交互。当然了,这种交互方式是阻塞的。

自己的扩展应用:

1.加入Service与Activity的交互功能。(传说中的IPC通信)

   原理:

   客户端:构建一个与Service通信的媒介,一个Messenger对象(里面的目标Handler就是客户端自己的一个Handler对象),客户端发送消息时,只需要将消息的replyTo设置为自己的Messenger对象,到时候Service通过得到这个目标Handler句柄,往对应的消息队列里面添加消息。客户端再取出消息,就可以达到通信目的了。

   Service:构建一个Messenger对象(里面的目标Handler是)Service自己的一个Handler对象,客户端在通过ServiceConnection绑定Service时,OnBind方法会返回一个Messenger的IBinder对象,然后这个对象回调给ServiceConnection的onServiceConnected()方法,客户端在该方法里面就可以得到Service的Messenger对象的句柄。就可以通过这个Messeneger对象与Service通信。

   有点类似于AIDL(AIDL是利用一个共同的接口,客户端回调接口就可以实现与Service的交互)

总结: 未来编程之路还长着。路漫漫兮,吾将上下而求索。

Demo地址: http://download.csdn.net/detail/u010979495/8390357

0 0
原创粉丝点击