服务是基于应用程序的进程所开展而来,依赖改进程的应用程序。
安卓的UI线程是不安全的,要实现应用程序中的UI元素,必须在主线程中进行,否则异常。(即打开应用为主线程,而应用中的功能必须在子线程中进行)
利用异步消息处理机制进行UI操作。 即,将子线程程序不做逻辑动作,而将子线程发出message给Handler,Handler接收到后,在handlerMessage()中进行处理,而此时方法已在主线程中,故子线程发消息给主线程的接受者,再在主线程中进行处理逻辑动作。
安卓中的异步处理消息机制由4个部分组成:Message,Handler,MessageQueue,Looper。
1.Message 在线程之间传递消息,本身可携带少量信息。
2.Handler 用于发送和处理消息,发消息用的是Handler的sendMessage()方法, 接受到消息是在Handler的handler的handleMessage()方法中。
3.MessageQueue 存放通过Handler发送过来的消息,类似于一个消息队列
4.Looper 作为MessageQueue的管家,调用了Looper 的loop()方法后 实现一个循环,每回取以此队列中的消息,再和前面的过程一样,传递到Handler的handlerMessage()方法中。
总结下来就是,首先在主线程中创建Handler对象,并且重写了handlerMesaage()方法。子线程要进行UI操作时,创建一个Message对象,并利用Handler将消息发出,发出的消息被添加到MessageQueue队列中,接着Looper从队列中取出消息,再分发回Handler的handlerMessage()方法中,由于此方法建立在主线程中,故。
服务
定义一个服务,重写Service中的方法
onCreate() 在服务创建时调用
onStartCommand() 在每次服务启动时调用
onDestory() 在服务销毁时调用(回收不再使用的资源)
活动与服务之间的通信 P356
活动通知了服务,服务就直接进行下去了, 活动在指挥服务的进行。即只提供通知开始服务,但并不知道活动中服务进行的情况
创建一个A类来继承Binder,并在A类内部提供方法, 然后再继承Service的服务中创建A的实例,在onBinder()方法中返回这个实例,如此这个服务就完成了。 当一个活动和服务绑定时,即可调用服务中的Binder提供的方法。