美文网首页
IntentService 简介

IntentService 简介

作者: feifei_fly | 来源:发表于2018-05-06 16:06 被阅读0次

IntentService

  • IntentService 内部维护一个HanlderThread和一个Handler。实际是维护了一个单线程的任务队列。通过IntentService启动的任务都是按顺序依次执行的,并且是在子线程中执行。
public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;
   @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()创建HandlerThread、mServiceLooper和mServiceHandler。onStartCommand 将任务添加到任务队列中。任务从任务队列中取出 会在handleMessage中交给onHandleIntent()方法来执行。

  • 当所有的任务都执行完毕后,IntentService会自己销毁。

 @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 onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
    
    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);
        }
    }
image

IntentService适用的场景:

当一个任务有很多小任务组成,并且这些小任务必须按一定顺序执行,而且这些任务可能会比较耗时。

使用IntentService

使用IntentService 只需要继承IntentService,

  • 复写onHandleIntent方法
  • 同时创建一个缺省的构造方法

HandleTaskService.java

public class HandleTaskService extends IntentService {
    private static final String TAG = HandleTaskService.class.getSimpleName();

    /**
     * 单线程 任务队列中,需要处理任务的方法(子线程执行)
     * @param intent
     */
    @Override
    protected void onHandleIntent(Intent intent) {

        String op = intent.getStringExtra("op");
        int param = intent.getIntExtra("param",-1);

        Log.d(TAG,"onHandleIntent - op:"+op+"_"+param+",Thread:"+Thread.currentThread().getName());

        try {
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }finally {

        }

        Log.d(TAG,"onHandleIntent task "+op+"_"+param+",finish"+",Thread:"+Thread.currentThread().getName());

    }

    /**
     * 无参构造方法
     */
    public  HandleTaskService(){
        super("HandleTaskService");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"onCreage()");
    }

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

manifest.xml

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

调用IntentService:

   Intent intent = new Intent(this,HandleTaskService.class);
        intent.putExtra("op","delete");
        intent.putExtra("param",i++);
        startService(intent);

参考链接:
https://www.jianshu.com/p/945c97556964
https://blog.csdn.net/smbroe/article/details/45009721

github:
https://github.com/feifei-123/MyExampleCode
参看工程中intentserviceexample子模块

相关文章

网友评论

      本文标题:IntentService 简介

      本文链接:https://www.haomeiwen.com/subject/rmeurftx.html