知识 | 解析深入浅出AndroidAndroid技术知识

Android IntentService 源码解析

2017-01-24  本文已影响97人  伪文艺大叔

Service作为Android四大组件之一在项目开发中至关重要,一些耗时的业务都会用到Service,但是因为Service是在主线程当中的,所以要想在Service中做一些耗时的操作必须要自己创建Thread,还好Android提供了另外一个类就是我们要讲的IntentService,IntentService是Service的子类,下面就让我们通过源码来看看它内部的实现,我们先来看看它的onCreate方法。

onCreate方法
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);
}

首先创建了一个HandlerThread,不了解HandlerThread的可以看看这篇文章(http://www.jianshu.com/p/d1e0bb996601
启动线程,创建ServiceHandler,通过onCreate方法可以看出它内部封装了一个
Handler,Looper,Thread的消息处理逻辑。

onStart方法
 public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
 }

通过mServiceHandler发送了一条消息,然后回到handleMessage执行逻辑

public void handleMessage(Message msg) {
       onHandleIntent((Intent)msg.obj);
       stopSelf(msg.arg1);
}

onHandleIntent就是我们要重写的方法,这里处理我们的业务逻辑,stopSelf方法销毁IntentService,如果这条消息是最后一条消息就销毁,否则不销毁,我们通过代码来验证下

public class TestService extends IntentService {

    public static final String TAG = "TestService";

    public TestService() {
        super("st");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.i(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand:" + startId);

        return super.onStartCommand(intent, flags,startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }
}

通过startService启动
startService(new Intent(EleActivity.this, TestService.class));
我们来看看打印结果

01-24 13:42:53.597 3172-3172/com.fear I/TestService: onCreate
01-24 13:42:53.598 3172-3172/com.fear I/TestService: onStartCommand:1
01-24 13:42:53.600 3172-3172/com.fear I/TestService: onDestroy

我们调用了onStartCommand方法一次发送一条消息,消息处理完销毁自己。
那我们发送5条消息会是什么有样子呢?

 for(int i = 0; i < 5; i++)
 {
      startService(new Intent(EleActivity.this, TestService.class));
 }

因为IntentService的onCreate只会调用一次,如果启动5次是会调用5次onStartCommand方法,我们来看看打印结果

01-24 13:45:02.535 6363-6363/com.fear I/TestService: onCreate
01-24 13:45:02.536 6363-6363/com.fear I/TestService: onStartCommand:1
01-24 13:45:02.536 6363-6363/com.fear I/TestService: onStartCommand:2
01-24 13:45:02.536 6363-6363/com.fear I/TestService: onStartCommand:3
01-24 13:45:02.537 6363-6363/com.fear I/TestService: onStartCommand:4
01-24 13:45:02.537 6363-6363/com.fear I/TestService: onStartCommand:5
01-24 13:45:02.542 6363-6363/com.fear I/TestService: onDestroy

可以看到调用了5次onStartCommand,发送了5条消息,消息都处理完,然后销毁自己。

总结

IntentService是Service子类,重写了onCreate方法和onStart方法,内部封装了Handler,Looper,Thread来处理消息,开发者可以通过复写onHandleIntent来处理自己的业务逻辑。

上一篇下一篇

猜你喜欢

热点阅读