service组件

来源:互联网 发布:福布斯网络作家富豪榜 编辑:程序博客网 时间:2024/06/06 12:54

服务:是一个长时间运行在后台没有用户交互界面的组件。它和广播一样是运行在主线程当中的。如果需要做耗时任务也是需要开子线程去处理,然后再根据结果来回到主线程更新UI。

由来
因为在android中UI主线程不是线程安全的,一般不能在子线程当中去更新UI,但是有时候需要根据一些耗时操作的结果来更新UI,而耗时操作一般都会开启子线程来执行。而我们又不能在子线程当中更新UI,所以就出现了android的异步消息处理机制(Handler)。

知识点
1.handler(异步消息处理机制)
由Message,Message queue,looper,Handler,组成
a.Message:线程之间的消息它有message.what 常量 message.arg1 message.arg2 整型 message.obj 对象
b.Message queue
消息队列,用于存放通过handle发送的消息,每个线程只有一个消息队列对象。
c.looper
轮询器,用于从消息队列当中取出消息并传递到主线程的handler当中的handlermessage方法中
d.handler
用于发送和处理消息

处理流程:
首先在主线程当中创建handler对象并重写父类的handlemessage方法来处理子线程发送过来的消息。然后在子线程当中创建一个message对象并通过handler对象发送到主线程当中的处理方法当中。handler 对象 是在主线程当中创建的所以handlemessage方法也是运行在主线程当中的,所以是可以更新UI的。

2.AsyncTask
是一个抽象类,封装了异步消息处理机制和线程池。不需要知道异步消息处理机制的原理就可以进行线程之间的切换。
因为是一个抽象类,所以使用的时候需要我们去实现。它有3个泛型参数。下面是一个最简单的实现。

当中我们需要重写几个方法
//用于初始化操作,显示一个进度条对话框等
onPreExecute()
//子线程当中的耗时操作
doInBackground()
//根据耗时操作的结果进行更新UI
onProgressUpdate()
//提醒任务结果,关闭对话框等
onPostExecute()
new DownloadTask().execute();来执行任务

3.服务
用法
定义一个服务类继承自Service类
public class MyService extends Service{
构造
public MyService(){}
下载功能
private DownloadBinder mBinder = new DownloadBinder()
class DownloadBinder extends Binder{}
重写
onBind(){
return mBinder;
}
onCreate()
onStartCommand()
onDestroy()
}
如果需要在服务中进行实现功能,思路则是在类中直接创建一个Binder对象来管理。在myservice中写一个功能的内部类。

活动与服务的通信

服务的生命周期

前台服务

intentService

原创粉丝点击