• Android异步之旅:探索IntentService


    1.介绍IntentService


           IntentService是Android中的一个Service类,用于在后台执行耗时操作,而不会阻塞UI线程。它封装了HandlerThread和Handler,使得我们可以方便地在后台执行任务,而不需要自己管理线程和消息处理。

    以下是 IntentService 的主要特点和用法:

    1. 自动停止:当所有的请求都被处理完毕后,IntentService 会自动停止,无需手动调用 stopSelf() 方法。

    2. 工作线程:IntentService 会在后台创建一个工作线程来处理请求,因此可以安全地执行长时间运行的任务,而不会阻塞主线程。

    3. 队列处理:IntentService 会按照请求的顺序逐个处理,确保每个请求都能得到处理,不会出现并发问题

    4. 默认实现:IntentService 已经实现了 onStartCommand() 方法和 Handler,因此开发者只需要实现 onHandleIntent() 方法来处理请求逻辑即可。

    2.IntentService源码


    总结:

    1. 在onCreate方法中,IntentService创建了一个HandlerThread和Handler对象,并启动HandlerThread,用于执行后台任务。

    2. 在onStartCommand方法中,IntentService会调用onStart方法,并将传入的Intent传递给onStart方法。

    3. 在onStart方法中,会通过Handler对象发送消息,调用onHandleIntent方法来处理传入的Intent,这是一个抽象方法,需要我们自己来实现具体的后台任务逻辑。

    4. 在onDestroy方法中,IntentService会停止HandlerThread,并释放资源。

    下面是详细的源码解析:

    IntentService类封装了HandlerThread和Handler。

    1. public void onCreate() {
    2.   super.onCreate();
    3.   HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    4.   thread.start();
    5.   mServiceLooper = thread.getLooper();
    6.   mServiceHandler = new ServiceHandler(mServiceLooper);
    7. }

    当IntentService被第一次启动时,它的onCreate方法会被调用,onCreate方法被创建一个HandlerThread,然后使用它的Looper来创建一个Handler对象mServiceHandler,mServiceHandler发送的消息最终都会在HandlerThread中执行,从这个角度来看,IntentService也可以用于执行后台任务。每次启动IntentService,它的onStartCommand方法就会调用一次,IntentService在onStartCommand中处理每个后台任务的Intent。下面看法就会调用一次,IntentService在onStartCommand中处理每个后台任务的Intent。下面看一下inStartCommand方法是如何处理外界的Intent的,onStartCommand调用了onStart的实现如下:

    1. public void onStart(@Nullable Intent intent, int startId) {
    2.   Message msg = mServiceHandler.obtainMessage();
    3.   msg.arg1 = startId;
    4.   msg.obj = intent;
    5.   mServiceHandler.sendMessage(msg);
    6. }

    IntentService类中的onDestroy方法如下:

    1. @Override
    2. public void onDestroy() {
    3. mServiceLooper.quit();
    4. }

    在这段代码中,mServiceLooper是一个HandlerThread的实例,quit()方法用于停止HandlerThread的消息循环并释放相关资源。这是为了确保在Service销毁时,后台线程也能够被正确地停止和清理,以避免内存泄漏和资源浪费。 

    3.IntentService的简单使用


    使用步骤:

    步骤1: 定义 Intentservice 的子类,需复写 onHandleIntent() 方法

    步骤2:在 Manifest.xml中注册服务

    步骤3: 在 Activity 中开启 Service 服务

    1. public class MyIntentService extends IntentService {
    2.   public MyIntentService() {
    3.       super("MyIntentService");
    4.   }
    5.   @Override
    6.   protected void onHandleIntent(Intent intent) {
    7.       String action=intent.getStringExtra("task_action");
    8.       Log.d("xxx","receive task :"+action);
    9.       SystemClock.sleep(300);
    10.       if ("com.example.intentservice_java".equals(action)) {
    11.           Log.d("xxx","handle task:"+action);
    12.       }
    13.   }
    14.   @Override
    15.   public void onDestroy() {
    16.       Log.d("xxx","service onDestroy");
    17.       super.onDestroy();
    18.   }
    19. }

    发起三个后台任务请求:

    1. Intent service =new Intent(this,MyIntentService.class);
    2. service.putExtra("task_action","com.example.intentservice_java1");
    3. startService(service);
    4. service.putExtra("task_action","com.example.intentservice_java2");
    5. startService(service);
    6. service.putExtra("task_action","com.example.intentservice_java3");
    7. startService(service);

  • 相关阅读:
    一文讲明白K8S各核心架构组件
    OpenCV自学笔记十四:Canny边缘检测
    前端使用 Konva 实现可视化设计器(10)- 对齐线
    Qt5.9.1-下载安装环境搭建——HelloWorld
    使用CometD技术实现web系统中的主动推送
    11 假设检验
    Docker
    图解LeetCode——1752. 检查数组是否经排序和轮转得到(难度:简单)
    [SUCTF 2019]CheckIn (.htaccess和.user.ini)
    计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/134717805