IntentService的原理?service 和IntentSevice的区别?

service:

android中是服务于后台,当应用程式挂在后台时service仍然可以可以服务于组件间通信和操作。service是依赖主线程的,所以如果做一些耗时操作会出现ANR,如果要处理耗时操作时,应该在onStartCommand()函数中起一个子线程来处理。需要主动关闭。

IntentService

IntentService是一个基础类是在service的基础上(service+handler+thread)封装的的一个类,拥有service的特性;用于处理Intent类型的异步任务请求。当客户端调用android.content.Context#startService(Intent)发送请求时,Service服务被启动,且在其内部构建一个工作线程来处理Intent请求。当工作线程执行结束,Service服务会自动停止。IntentService是一个抽象类,用户必须实现一个子类去继承它,且必须实现IntentService里面的抽象方法onHandleIntent来处理异步任务请求。会自动关闭。

源码分析:

public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    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;
    }
    public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
    }

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

分析:

1,构造函数:

public IntentService(String name) {
        super();
        mName = name;
        //传入了一个名字,这个名字是在创建一个HandlerThread ,为该线程取名用的,至于HandlerThread 是个什么东西,我们现放在这里后面再讲
        /*new HandlerThread("IntentService[" + mName + "]");
        */
         }

2,onCreate():

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

onCreate中,用HandlerThread 类创建一个工作线程,并把自带的looper对象 ,传给了ServiceHanler;HandlerThread+Handler构建成了一个带有消息循环机制的异步任务处理机制。因此开发者就可以将异步任务封装成消息的形式发送到工作线程中去执了。

3,ServiceHandler :

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

onCreate中创建了ServiceHandler,ServiceHandler其实就是一个Handler类的子类,hanlemessage接收到消息再传给抽象方法onHandleIntent(),然后IntentService的子类复写onHandleIntent方法,就能收到消息并进行处理。

4,onStart和onStartCommand:

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

Service创建之后会走到onstartCommand这里,这个方法里调用了onStart方法,而onStart方法则是利用mServiceHandler发出一条消息,消息再回调给onHandleIntent。也是说我们创建Intentservice的时候创,可以通过Intent把数据给IntentService的onHandleIntent方法中。

5,onDestroy():

 @Override
    public void onDestroy() {
        mServiceLooper.quit(); 
    }

mServiceLooper.quit();意识就是 停止looper相当于 mServiceLooper = thread.getLooper(); mServiceLooper是根据当前HandlerThread的工作线程获取到的一个Looper对象,在销毁时候停止。

总结:

1,IntentService是一个用来处理异步任务并且处理完任务之后会自行退出的service(PS:handleMessage 里回调onHandleIntent之后调用了stopSelf(msg.arg1););

2,service 和IntentService的区别是,IntentService有自己的工作线程,不会阻塞主线程出现ANR,而且任务结束后会自己停止,不需要手动停止。相反service会依赖创建它的线程,所以在处理耗时操作时会出现ANR情况,一般要service+thread组合使用。

3,多次启动Intentservice会怎样?

多次启动不会创建多个service的实例,而是都会走onStartCommd和onstart方法,因为内部HandlerThread的缘故,多个任务不会同时执行,应为HandlerThread内部只有一个子线程,任务会排成队逐个执行直到结束。

4,什么情况下用到Intentservice?

任务要一步一步执行,并且执行结束后自行结束服务,比方说,自动更新,下载apk,安装apk,等等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值