intentservice源码分析
2016-07-06 14:04
323 查看
IntentService源码分析
1 概论
IntentService是一种处理异步请求的Service。客户端通过调用Context.startService(Intent)来发送请求,启动Service;Service按需启动后,会依次按顺序处理工作线程中的Intent,并且在工作结束后会自动停止。
2 IntentService是如何启动一个异步线程处理请求的?
IntentService在创建时,会创建并启动一个线程HandlerThread,并且赋予这个线程一个Looper;@Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); }
ServiceHandler是Handler的一个子类,用来接受处理消息Message,我们知道一般Handler是在UI主线程接受处理消息的,要想在异步线程接受处理消息,必须给这个异步线程关联一个Looper,并且在异步线程调用Looper.prepare()方法;
public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } ... @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } ... }
3 IntentService是如何处理Intent的
调用Context.startService(Intent)后,Service被启动,执行onCreate()方法,然后执行onStart(Intent intent,int startId);public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }
可以看到Service开始后,会把Intent对象通过Handler机制交给ServiceHandler来处理,ServiceHandler接受到消息后:
private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } }
ServiceHandler接受到消息后,取出Intent,启动onHandleIntent(Intent) 方法,来处理Intent;
我们来看onHandleIntent(Intent intent);
protected abstract void onHandleIntent(Intent intent);
这是一个抽象方法,留给开发者自己实现,异步操作的实现逻辑都在这个抽象方法里面;操作完成后,通过调用
stopSelf()Service
4 总结
IntentService在创建的时候会创建一个线程,并启动这个异步线程;创建的异步线程会利用Looper、Handler来创建、发送、接受消息Message,与UI主线程通过Handler机制进行线程通信是同理的;
Service的异步操作逻辑是定义在抽象方法onHandleIntent(Intent)里面,开发者需要实现这个抽象方法;
ServiceHandler处理消息是在异步线程里面的,onHandleIntent(Intent)也是运行在异步线程里面的,这与UI主线程里面的Handler不同;
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories