美文网首页
IntentService使用&源码解析

IntentService使用&源码解析

作者: 北疆小兵 | 来源:发表于2019-10-23 16:47 被阅读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);
}

  • 1.在Service的onCreate中初始化了HandlerThread和Looper,由
  • 2.mServiceHandler 绑定了HandlerThread的Looper
  • 3.在在Service的onStart方法中利用mServiceHandler发送消息
  • 4.在mServiceHandler的handleMessage调用onHandleIntent()方法(该方法是在子线程中执行,因为mServiceHandler绑定的是HandlerThread的Looper)
  • 5.调用stopSelf()结束service自身

使用步骤

  • 定义IntentService的子类,复写onHandleIntent方法
  • 在AndroidManifest文件中注册service
  • 调用startService启动服务

实例讲解

  • 定义IntentService的子类,重写onHandleIntent方法
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);


    }
}

  • AndroidManifest文件中注册Service
  <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

对比

  • IntentService与普通Service的区别
    • IntentService会自动启动工作线程处理多线程任务,Service默认允许在主线程,需要手动创建工作线程处理任务
    • IntentService在执行完任务后会自动结束自身,Service需要手动调用StopService结束自身
  • IntentService与其他线程的区别
    • IntentService的线程采用HandlerThread实现,其它线程是采用Thread或者Runnable实现
    • IntentService继承了四大组件中的Service来做后台任务,优先级高,不易被进程杀死;普通线程所在的进程如果没有活动的四大组件,则改线程的优先级很低,容易被系统杀死

优点

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

缺点

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

总结

  • IntentService用于处理异步请求,适合执行单线程耗时任务场景

相关文章

网友评论

      本文标题:IntentService使用&源码解析

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