本文共 8148 字,大约阅读时间需要 27 分钟。
4.IntentService源码分析
IntentService的介绍
IntentService的作用
目前,由于正式项目中application初始化工作太多,所以决定分担部分逻辑到IntentService中处理比如:现在application初始化内容有:数据库初始化,阿里云推送初始化,腾讯bugly初始化,im初始化,神策初始化,内存泄漏工具初始化,头条适配方案初始化,阿里云热修复……等等。将部分逻辑放到IntentService中处理,可以缩短很多时间。
步骤1:定义InitializeService类,并且需要继承IntentService的子类
//第一步InitializeService.start(this);//第二步//第三步public class InitializeService extends IntentService { private static final String ACTION_INIT = "initApplication"; public static void start(Context context) { Intent intent = new Intent(context, InitializeService.class); intent.setAction(ACTION_INIT); context.startService(intent); } public InitializeService(){ //注意这里需要写类的名称 super("InitializeService"); } @Override protected void onHandleIntent(Intent intent) { if (intent != null) { final String action = intent.getAction(); if (ACTION_INIT.equals(action)) { initApplication(); } } } private void initApplication() { //处理耗时操作和避免在application做过多初始化工作,比如初始化数据库等等 }}
IntentService实际上内部实例化了一个HandlerThread,并且封装了一个Handler,所以他的工作流程通过上面的源码,分析如下:
/** ** @author yangchong * blog : https://github.com/yangchong211 * time : 2017/01/22 * desc : 初始化工作,子线程,处理耗时操作和避免在application做过多初始化工作,比如初始化数据库等等 * revise: **/public abstract class IntentService extends Service { //子线程中的Looper private volatile Looper mServiceLooper; //内部持有的一个mServiceHandler对象 private volatile ServiceHandler mServiceHandler; //内部创建的线程名字 private String mName; //服务被异常终止后重新创建调用onStartCommand是否回传Intent private boolean mRedelivery; /** * 内部创建了一个ServiceHandler,然后将传递过来的Intent封装成一个Message, * 然后再将Message封装成一个Intent,回调onHandleIntent,其实转换的目的就是 * 将主线程的Intent切换到子线程中去执行了而已。 */ private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { //处理发送过来的消息,在子线程 onHandleIntent((Intent)msg.obj); //处理完消息之后停止Service stopSelf(msg.arg1); } } /** * 工作线程的名字 * @param name name */ public IntentService(String name) { super(); mName = name; } public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } @Override public void onCreate() { super.onCreate(); //创建HandlerThread HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); //开启线程创建子线程Looper thread.start(); //获取子线程Looper mServiceLooper = thread.getLooper(); //创建子线程Handler mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public void onStart(@Nullable Intent intent, int startId) { //创建一个Message Message msg = mServiceHandler.obtainMessage(); //消息标志,作为当前Service的标志 msg.arg1 = startId; //携带Intent msg.obj = intent; //发送消息,此时将线程切换到子线程 mServiceHandler.sendMessage(msg); } @Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { //调用onStart方法 onStart(intent, startId); //根据mRedelivery的值来确定返回重传Intent的黏性广播还是非黏性广播 return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } @Override public void onDestroy() { //退出Looper mServiceLooper.quit(); } @Override @Nullable public IBinder onBind(Intent intent) { return null; } /*子类必须实现的抽象方法*/ @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent);}
// IntentService源码中的 onCreate() 方法@Overridepublic void onCreate() { super.onCreate(); // HandlerThread继承自Thread,内部封装了 Looper //通过实例化andlerThread新建线程并启动 //所以使用IntentService时不需要额外新建线程 HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); //获得工作线程的 Looper,并维护自己的工作队列 mServiceLooper = thread.getLooper(); //将上述获得Looper与新建的mServiceHandler进行绑定 //新建的Handler是属于工作线程的。 mServiceHandler = new ServiceHandler(mServiceLooper);}private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); }//IntentService的handleMessage方法把接收的消息交给onHandleIntent()处理//onHandleIntent()是一个抽象方法,使用时需要重写的方法 @Override public void handleMessage(Message msg) { // onHandleIntent 方法在工作线程中执行,执行完调用 stopSelf() 结束服务。 onHandleIntent((Intent)msg.obj); //onHandleIntent 处理完成后 IntentService会调用 stopSelf() 自动停止。 stopSelf(msg.arg1); }}//onHandleIntent()是一个抽象方法,使用时需要重写的方法@WorkerThreadprotected abstract void onHandleIntent(Intent intent);
public int onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId;//把 intent 参数包装到 message 的 obj 中,然后发送消息,即添加到消息队列里//这里的Intent 就是启动服务时startService(Intent) 里的 Intent。 msg.obj = intent; mServiceHandler.sendMessage(msg);}//清除消息队列中的消息@Overridepublic void onDestroy() { mServiceLooper.quit();}
分析:
@Overridepublic IBinder onBind(Intent intent) { return null;}
转载地址:http://amnkl.baihongyu.com/