IntentService解析
来源:互联网 发布:打点器数据端无法打开 编辑:程序博客网 时间:2024/05/20 04:25
1、源码解析
IntentService注释:
IntentService is a base class for {@link Service}s that handle asynchronousrequests (expressed as {@link Intent}s) on demand. Clients send requeststhrough {@link android.content.Context#startService(Intent)} calls; theservice is started as needed, handles each Intent in turn using a workerthread, and stops itself when it runs out of work.
大概意思是:IntentService是基于Service的一个扩展类,主要用于处理异步请求;可以通过startService提交请求,该service在需要的时候被创建,请求是在工作线程中处理的,当完成所有任务后,该service会自动关闭。
源码:
public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private String mName; private boolean mRedelivery; 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); } } public IntentService(String name) { super(); mName = name; } public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } @Override public void onCreate() { // TODO: It would be nice to have an option to hold a partial wakelock // during processing, and to have a static startService(Context, Intent) // method that would launch the service & hand off a wakelock. super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); } @Override public int onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } @Override public void onDestroy() { mServiceLooper.quit(); } @Override public IBinder onBind(Intent intent) { return null; } @WorkerThread protected abstract void onHandleIntent(Intent intent);}
通过上面的源码阅读,可以看出,它在onCreate()中初始化了一个HandlerThread,并关联了ServiceHandler;
然后在每次调用onStartCommand(),回调了onStart()方法,通过ServiceHandler发送一个msg,消息体中包含我们的intent;最后handleMessage中回调onHandleIntent()方法,用于处理intnet事件;回调完成后调用stopSelf。
注意这个stopSelf(msg.arg1),msg.arg1为int值,相当于一个请求的唯一标识,每发送一个请求,会生成一个唯一标识,然后将请求放入队列;当请求全部执行完成后(最后一个请求也就相当于getLasrStartId == startId)或者当前发送的标识是最近发出的那一个(getLasrStartId == startId),会销毁service。如果传入-1则直接销毁。
当service销毁会调用onDestory(),在onDestroy()中会释放Looper:mServiceLooper.quit()。
参考:
http://blog.csdn.net/lmj623565791/article/details/47143563
0 0
- IntentService解析
- IntentService解析
- IntentService解析
- IntentService解析
- intentService解析
- IntentService解析
- Android IntentService解析
- Android IntentService完全解析
- IntentService源码解析
- IntentService 源码解析
- Android IntentService 源码解析
- 【IntentService】原理解析
- Android IntentService 使用解析
- IntentService从源码解析
- Anroid IntentService解析
- IntentService用法解析
- Android IntentService解析
- Andorid IntentService 完全解析
- 分支记录和性能监视
- web开发(六)之激活邮件发送
- 自主实现sleep函数(代码实现)
- [OpenGL] 利用精灵表制作动画
- 题目链接...
- IntentService解析
- 深入理解C++类的构造函数与析构函数
- servlet测试获取请求行信息
- 虚拟机联网和互ping的问题
- LeetCode - 90. SubsetsII
- 集训第八天
- jQuery:bind方法的使用详解
- python实现模拟按键,自动翻页看u17漫画
- 字符串的展开