IntentService使用&源码解析

2019-10-23  本文已影响0人  北疆小兵

定义

IntentService是Service的一个子类,用于处理异步请求,当调用startService方法时会开启一个新线程执行任务,并且在执行任务完成后自动停止自身

作用

处理异步请求,实现多线程

应用场景

1.按顺序在后台执行任务
2.不适合多个数据同时请求的场景

原理解析

public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    @UnsupportedAppUsage
    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;
    }

        @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

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

       @Override
    @Nullable
    public IBinder onBind(Intent intent) {
        return null;
    }

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

使用步骤

实例讲解

public class DownloadService extends IntentService {

    public DownloadService() {
        super("download service 2");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String taskName = intent.getStringExtra("taskName");
        MainLogUtil.d("onHandleIntent taskName = %s", taskName);
        for (int i = 0; i < 5; i++) {
            try {
                MainLogUtil.d("onHandleIntent 任务 %s, taskName = %s,thread = %s",taskName,i,Thread.currentThread().getName());
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        MainLogUtil.d("onCreate");
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        MainLogUtil.d("onStartCommand");
        return super.onStartCommand(intent, flags, startId);


    }
}

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

  Intent intent1 = new Intent(getContext(),DownloadService.class);
                intent1.putExtra("taskName", "task1");
                getContext().startService(intent1);


Intent intent2 = new Intent(getContext(),DownloadService.class);
intent2.putExtra("taskName", "task2");
getContext().startService(intent2);

测试结果

15981571820362_.pic_hd.jpg

对比

优点

1.启动服务后自动启动和管理线程,不用手动启动系统
2.任务执行完后会自动结束服务,不用手动stopService
3.任务顺序执行,不用考虑并发问题

缺点

1.由于IntentService采用的是HnadlerThread的线程模式,任务为按顺序逐一执行,因此不适合同时请求多个数据的场景

总结

上一篇 下一篇

猜你喜欢

热点阅读