IntentService详细介绍(含使用实例及源码分析)

0、目录

一、简介

二、Service介绍

三、使用步骤

四、使用实例

五、源码分析

六、IntentService与service的区别

七、总结

一、简介

IntentService详细介绍(含使用实例及源码分析)_第1张图片

二、Service介绍

生命周期:

IntentService详细介绍(含使用实例及源码分析)_第2张图片

首次启动服务时,

调用startService()方法开启服务后,服务的执行过程:onCreat()-->onStartCommand()-->onDestroy();

调用bindService()方法开启服务后,服务的执行过程:onCreat()-->onBind()-->onUnbind()-->onDestroy()

若服务已经启动,再次调用startService()方法启动服务时,则不会再次调用onCreat()方法,而是直接执行onStartCommand()方法;再次调用bindService()方法启动服务时,如果没有绑定,则执行onBind()方法,如果已经绑定,则啥都不执行。

停止服务时,如用startService()开启的服务,则用stopServic()方法停止服务;如用bindService()开启的服务,则用unbindService()方法停止服务。

三、使用步骤

步骤一、创建子类,继承IntentService,并根据需要复写onCreat()、onStartCommand()、onHandleIntent()(必须实现)、onDestroy()

步骤二、在Manifest.xml中注册服务

步骤 三、在Activity中开启服务

四、使用实例

步骤 一、继承IntentService,创建子类,并根据需要实现onCreat()、onStartCommand()、onHandleIntent()(必须实现)、onDestroy()。

//步骤 一、继承IntentService,创建子类,并根据需要实现onCreat()、onStartCommand()、onHandleIntent()(必须实现)、onDestroy()。

package com.example.IntentServiceDemo;

import android.app.IntentService;
import android.content.Intent;

public class MyIntentService extends IntentService {
    //构造器
    public MyIntentService() {
        //参数为工作线程的名字
        super("MyIntentService");
    }

    //首次创建服务时调用,如已经创建服务,再次启动服务则不会被调用
    //运行于UI线程
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println(Thread.currentThread().getName() + ":" + "onCreate");
    }

    //每次创建服务时都会被调用
    //运行于UI线程
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println(Thread.currentThread().getName() + ":" + "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

   //在onStartCommand()中被调用
   @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        System.out.println(Thread.currentThread().getName() + ":" + "onStart");
    }

    //执行耗时任务的地方,必须复写
    //工作线程
    @Override
    protected void onHandleIntent(Intent intent) {
        //根据Intent做相关的处理
        String s = intent.getStringExtra("name");
        if (s.equalsIgnoreCase("myIntent")) {
            try {
                Thread.sleep(3000);
                System.out.println(Thread.currentThread().getName() + ":" + "onHandleIntent sleep 3s");
            } catch (Exception e) {

            } 
        } 
    }

    //销毁服务
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println(Thread.currentThread().getName() + ":" + "onDestroy");
    }
}

步骤二、在Manifest.xml中注册服务
    service android:name="com.example.IntentServiceDemo.MyIntentService">
            
                
            
        

步骤三、在Activity中启动服务
                Intent intent = new Intent("haovin"); 
                intent.putExtra("name", "myIntent");
                intent.setPackage(getPackageName());
                for (int i = 0; i < 3; i++) {
                    startService(intent);
                }

执行结果如下:

IntentService详细介绍(含使用实例及源码分析)_第3张图片

五、源码分析

1、onCreate()源码:
    //Called by the system when the service is first created. Do not call this method directly.
    @Override
    public void onCreate() { 
        super.onCreate();
        //创建一个HandlerThread类型的工作线程thread 
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        //启动线程
        thread.start();

        //获取与该线程绑定的Looper
        mServiceLooper = thread.getLooper();
        //创建一个Handler,并绑定到工作线程thread  -->分析1
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

分析1:ServiceHandler
    private final class ServiceHandler extends Handler {
        //构造方法
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        //复写handleMessage()方法
        @Override
        public void handleMessage(Message msg) {
            //已经在工作线程中执行
            //调用自己复写的onHandleIntent()方法,执行耗时任务
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    } 

2、onStartCommand()源码
     @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
       //调用onStart()方法 ,详见onStart()源码
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }
3、onStart()源码
    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        //获取一个消息对象
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        //把Intent参数包装到消息对象的obj属性中
        //此处的intent,就是在Activity中调用startService(Intent intent)方法出入进来的
        msg.obj = intent;
        //把消息添加到与mServiceHandler绑定的消息队列处理
        mServiceHandler.sendMessage(msg);
    }

4、onDestroy()源码
    //服务结束时调用该方法
    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

总结:

1、IntentService是Service的子类,内部实现了Handler+HandlerThread

2、在onCreat()方法内创建了一个HandlerThread工作线程,并创建了与该工作线程绑定的Handler

3、通过onStartCommand()方法传递启动服务时的Intent到Handler,放入消息队列,并从消息队列取出处理,处理完成后,再取出下一个消息进行处理,根据入队列的顺序依次执行。

六、IntentService与service的区别

IntentService详细介绍(含使用实例及源码分析)_第4张图片

七、总结

以上就是IntentService所有总结,包括使用方法和源码分析等,欢迎一起讨论。

你可能感兴趣的:(多线程)