IntentService源码分析

Service作为 Android 四大组件之一,其与Activity的区别可以理解为没有界面的Activity也就是说,Service要做的事情更多是置于后台进行操控,就像幕后黑手一样在无声无息中制造大量事件,因此,较为耗时的操作以及需要长时间使用但是却不需要展现界面的操作,都置于Service中运行,例如:数据处理以及Socket连接等。

IntentService继承于Service,可以理解为对于Service进行一层封装,但是,封装了什么?

估计大部分人都知道,IntentServiceService的区别重点在于IntentService内部会启动一个线程进行操作执行,并且在执行完操作后,会自动停止该服务,而Service需要自己启动线程并且自己管理什么时候进行销毁,所以不注意的话,会导致应该被销毁的Service一直在后台存活,从而导致内存浪费。

IntentService的简单使用

MyService 代码:

public class MyService extends IntentService {

    private int count = 0;

    public MyService() {
        super("MyService");
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        //count每次+1,并输出当前的线程名字和count值
        count++;
        Log.i(Thread.currentThread().getName(), "count = " + count);
    }
}

AndroidManifest中注册:

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

循环启动MyService

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

结果输出:

I/IntentService[MyService]: count = 1
I/IntentService[MyService]: count = 2
I/IntentService[MyService]: count = 3
I/IntentService[MyService]: count = 4
I/IntentService[MyService]: count = 5

IntentService源码分析(源码只保留关键部分,并非全部源码)

既然IntentService集成于Service,那么,我们就从Service的生命周期开始看起:

构造方法

    public IntentService(String name) {
        super();
        mName = name;
    }

设置name属性

onCreate()

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

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
  • 创建HandlerThread,并把构造方法中的name作为基础进行拼接为IntentService[" + mName + "]作为线程的名字,详情可以看看HandlerThread源码解析
  • HandlerThreadLooper作为参数,创建ServiceHandler

我们来看看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);
        }
    }

handleMessage里面只有两个操作:

  • 调用onHandleIntent方法
  • 将当前Service进行销毁

其实这两个方法就是IntentServiceService的区别:

  • 在新线程中执行onHandleIntent方法
  • 执行完onHandleIntent后进行该Service的销毁

不过,我们要注意,这里销毁Service是使用stopSelf(int startId),而不是stopSelf()。使用stopSelf(int startId),假如还有其它startId存在的话,其Service不会被销毁,若使用stopSelf(),则会把当前Service直接销毁。

onStart(@Nullable Intent intent, int startId)

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        //这里的startId,对应stopSelf(int startId)中的startId
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

创建Message,并使用ServiceHandler发送到消息队列中。

也就是会执行ServiceHandlerhandleMessage方法。

至此,IntentService的大致流程已经结束,不过还有一点,就是Looper是开启循环遍历消息队列的,所以在Service结束的时候,要记得把该队列进行退出:

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值