IntentService 高级使用指南

IntentService

在实际过程中,我们经常会遇到一些需求,比如在后台加载一些图片,或者下载一些文件,这个时候我们通常就会用到 Service ,但是 service 有个弊端:Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;所以如果我们的 Service 是要为活动服务的。那么在 Service 中建立 线程就显得不那么明智了,于是这个时候 IntentService 就被提出了。

“Android service”的图片搜索结果


概念

IntentService 是 Service 的基类,可根据需要处理异步请求(表示为 Intent )。客户端通过Context.startService(Intent)呼叫发送请求; 根据需要启动服务,使用工作线程依次处理每个Intent,并在工作失败时自行停止。


使用

步骤:

  1. 建立一个服务类,使它继承自 IntentService 
  2. 建立具体逻辑代码
  3. 在 Mainfest.xml 中进行注册

这里我结合 广播 给大家举个例子:


一、建立 MyIntentService 类

public class MyIntentService extends IntentService {

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

我们很显眼的看到了方法 :onHandleIntent ,让我们看看他的源码

可以看到这是一个非常简单的抽象方法,它的特性:

  • 在工作线程上调用此方法并请求处理。一次只处理一个Intent,但处理独立于其他应用程序逻辑运行的工作线程。 因此,如果此代码需要很长时间,它将阻止其他请求 相同的 IntentService,但它不会阻止其他任何东西。 处理完所有请求后,IntentService会自行停止, 所以你不应该致电{@link #stopSelf}。(译)

“Android service”的图片搜索结果


所以让我们在其中实现具体的逻辑功能

比如这里我添加了一个模拟耗时(下载):

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        try {
            Thread.sleep(1000);// 模拟初始化耗时
            sendIfoToBroadCast("服务正在运行中");
            int progressCount = 0;
            boolean isRunning = true;

            while (isRunning){
                progressCount ++;
                if (progressCount > 100){
                    isRunning = false;
                }else {
                    Thread.sleep(50);
                    sendIfoToBroadCast("下载进度:", progressCount);
                }
            }
            sendIfoToBroadCast("下载完成");
            Thread.sleep(1000);// 模拟初始化耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

每隔 50ms 发送一次广播 更新数据

    private void sendIfoToBroadCast(String serviceStatus){
        Intent intent1 = new Intent(IntentManager.ACTION_TYPE_SERVICE);
        intent1.putExtra(IntentManager.INTENT_STATUS_SERVICE, serviceStatus);
        manager.sendBroadcast(intent1);
    }

    private void sendIfoToBroadCast(String serviceStatus, int progressStatus){
        Intent intent = new Intent(IntentManager.ACTION_TYPE_THREAD);
        intent.putExtra(IntentManager.INTENT_STATUS_SERVICE, serviceStatus);
        intent.putExtra(IntentManager.INTENT_PROGRESS_SERVICE, progressStatus);
        manager.sendBroadcast(intent);
    }

根据刚刚翻译的文档可知:如果这个耗时操作结束,也就是 onHandleIntent 方法调用结束,那么 IntentService 也就会随之结束

    private int progressCount = 0;
    private boolean isRunning = false;
    private LocalBroadcastManager manager;

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

    @Override
    public void onCreate() {
        super.onCreate();
        manager = LocalBroadcastManager.getInstance(this);
        sendIfoToBroadCast("服务启动");
    }

    @Override
    public void onDestroy() {
        sendIfoToBroadCast("服务已结束运行");
        super.onDestroy();
    }

关于广播和活动里的实现详见我的这一篇-> 详键这篇博文 - https://blog.csdn.net/qq_43377749/article/details/90738979

全部详情请一打包 Demo -> https://github.com/FishInWater-1999/android_four_major_components/tree/master/app/src/main/java/com/entry/activitystudy/broadcast

最后的效果:

如果你觉得本篇博文总结的不错,记得给我点赞呦~~ 么么哒~~

六一快乐 啦啦啦

猜你喜欢

转载自blog.csdn.net/qq_43377749/article/details/90740356