Android线程之IntentService

Android线程之IntentService

        IntentService是一个继承Service的抽象类。所以我们使用它的时候需要创建继承IntentService的子类。可用来执行后台耗时任务。

public abstract class IntentService extends Service {}

IntentService第一次被启动时,它的onCreate方法会被调用,onCreate方法如下:

@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);
}

从IntentService的onCreate方法可以看出,在onCreate方法被调用的时候,会创建一个HandlerThread,然后通过HandlerThread的getLooper方法获取到的Looper来创建Handler。所以如果使用Handler发送消息,消息最终会交到HandlerThread的Looper中处理。每次启动IntentService,onStartCommand方法都会被调用,onStartCommand方法如下:

@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

在onStartCommand方法中会调用start方法,并将intent和startId作为参数传递进去,这个intent就是启动这个IntentService时的intent。启动IntentService方式如下:

Intent intent = new Intent(MainActivity.this, MyService.class);
intent.putExtra("tast_key","task_value");
startService(intent);

再来看看onStartCommand方法调用的onStart方法:

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

可以看到onStart方法通过mServiceHandler发送了一个消息,并将intent和startId携带在Message中,这个消息最终会在HandlerThread中处理,mServiceHandler收到消息后将intent传递给onHandleIntent处理,当onHandleIntent执行完后IntentService通过调用stopSelf(msg.arg1)来停止服务,stopSelf(msg.arg1)会等虽有消息都处理完才终止服务。

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);//停止服务
    }
}

@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);

onHandleIntent是一个抽象方法,需要在子类中实现具体逻辑,最后我们启动IntentService的intent就交到到子类的onHandleIntent方法中了

public class MyService extends IntentService {
    public MyService(String name) {
        super(name);
    }
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        //对Intent传入的后台任务进行处理
    }
}

每次启动IntentService,IntentService的内部都是通过Handler发送消息向HandlerThread执行任务,Handler中的Looper从MessageQueue中顺序取出消息处理,所以IntentService也是顺序执行后台任务,当多次启动IntentService,任务会按照外界的startService顺序执行。

        继承IntentService的服务需要在AndroidManifest.xml中注册

<service android:name=".MyService"/>

        而且我们在使用IntentService的时候,一定要有无参构造方法,不然会报异常java.lang.RuntimeException: Unable to instantiate ....MyService: java.lang.InstantiationException: ....MyService has no zero argument constructor

public class MyService extends IntentService {
    private static final String TAG = "MyService";
    public MyService(){
        super("name");

    }
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {

        Log.i(TAG, "Intent : " + intent.getStringExtra("tast_key"));
    }
}


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值