前言:
IntentService算是service中比较重要的一个类,而且就100行代码!今天一起阅读它的源码和注释。
成员变量(4个):
mServiceLooper: Looper 与线程关联的Looper
mServiceHandler: ServiceHandler 自定义Handler子类,会在handlerMessage中调用onHandleIntent;
mName: String 线程名,一般debugging用到
mRedelivery: boolean
mRedelivery(boolean ) | true | false |
onStartCommand(method) | START_REDELIVER_INTENT | START_NO_STICK |
onHandleIntent结束前process dies的策略 | 重启进程 | 不会重启,intent也会一起死 |
内部类的Handler:
private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); // 调用抽象 onHandleIntent方法 stopSelf(msg.arg1); // 完成服务后自动结束service,不用开发者调用 } }
方法:
protected abstract void onHandleIntent(@Nullable Intent intent); // 想要执行的方法
// 初始化内容 @Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); } // 从message池中取出数据来处理 @Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }
@Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } @Override public void onDestroy() { mServiceLooper.quit(); }