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

    xiaoxiao2025-05-02  29

    0、目录

    一、简介

    二、Service介绍

    三、使用步骤

    四、使用实例

    五、源码分析

    六、IntentService与service的区别

    七、总结

    一、简介

    二、Service介绍

    生命周期:

    首次启动服务时,

    调用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"> <intent-filter > <action android:name="haovin"/> </intent-filter> </service> 步骤三、在Activity中启动服务 Intent intent = new Intent("haovin"); intent.putExtra("name", "myIntent"); intent.setPackage(getPackageName()); for (int i = 0; i < 3; i++) { startService(intent); }

    执行结果如下:

    五、源码分析

    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所有总结,包括使用方法和源码分析等,欢迎一起讨论。

    最新回复(0)