Android异步加载全解析之IntentService

本文涉及的产品
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: Android异步加载全解析之IntentService搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask,再不济也使用的Thread,那么这个IntentService是个什么鬼。

Android异步加载全解析之IntentService

搞什么IntentService

前面我们说了那么多,异步处理都使用钦定的AsyncTask,再不济也使用的Thread,那么这个IntentService是个什么鬼。
相对与前面我们提到的这两种异步加载的方式来说,IntentService有一个最大的特点,就是——IntentService不受大部分UI生命周期的影响,它为后台线程提供了一个更直接的操作方式。不过,IntentService的不足主要体现在以下几点:

  • 不可以直接和UI做交互。为了把他执行的结果体现在UI上,需要发送给Activity。
  • 工作任务队列是顺序执行的,如果一个任务正在IntentService中执行,此时你再发送一个任务请求,这个任务会一直等待直到前面一个任务执行完毕。
  • 正在执行的任务无法打断。

创建IntentService

当我们创建一个类并继承IntentService后,通过IDE的提示,我们基本可以生成如下所示的代码:
package com.imooc.intentservicetest;

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

public class MyIntentService extends IntentService {

    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public MyIntentService(String name) {
        super(name);
    }

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

    @Override
    protected void onHandleIntent(Intent intent) {

    }
}

PS:需要注意的是,系统会提示我们生成一个带参数的构造方法,另外,我们还需要定义一个无参数的构造方法,并调用一个参数的构造方法。所以,一个带参数的构造方法其实是可以删掉的。

最重要的就是:
@Override
protected void onHandleIntent(Intent intent) {

}

在这个方法里面,我们从intent中获取数据,并进行相应的操作。

ps:IntentService继承自Service,但是我们不需要手动调用onStartCommand()等Service回调方法。

申明IntentService

我们需要在Mainifest文件中对IntentService进行申明:

<service android:name=".MyIntentService"
            android:exported="false"/>

与申明一个Service类似,但是却不需要申明<intent-filter>,因为发送任务给IntentService的Activity需要使用显式Intent,所以不需要filter。这也意味着只有在同一个app或者其他使用同一个UserID的组件才能够访问到这个IntentService。

启动IntentService

启动IntentService与启动Service基本类似,而且我们可以在Intent中传入相关的参数。例如:
package com.imooc.intentservicetest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = null;
        for (int i = 0; i < 10; i++) {
            intent = new Intent(this, MyIntentService.class);
            intent.putExtra("xys", "" + i);
            startService(intent);
        }
    }
}

可以看见,我们start了10个IntentService,最后执行的结果如下:
05-13 17:14:53.515  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent0
05-13 17:14:55.528  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent1
05-13 17:14:57.540  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent2
05-13 17:14:59.544  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent3
05-13 17:15:01.556  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent4
05-13 17:15:03.569  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent5
05-13 17:15:05.570  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent6
05-13 17:15:07.574  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent7
05-13 17:15:09.577  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent8
05-13 17:15:11.581  19991-20011/com.imooc.intentservicetest D/xys﹕ onHandleIntent9

所以说,启动IntentService之后,它将默认生成一个Worker Thread,并将这些IntentService依次放入队列,每次取出一个进行执行,当执行完毕后,这个IntentService会自动stop自己,当所有intent都执行完毕后,服务就结束了,不需要自己手动来结束。


IntentService修改UI

IntentService如果要进行UI的修改,那么只能通过Handler来实现,或者使用广播机制来通知修改UI。

IntentService与AsyncTask的区别


  • 对于异步更新UI来说,IntentService使用的是Serivce+handler或者广播的方式,而AsyncTask是thread+handler的方式。
  • AsyncTask比IntentService更加轻量级一点。
  • Thread的运行独立于Activity,当Activity结束之后,如果没有结束thread,那么这个Activity将不再持有该thread的引用。
  • Service不能在onStart方法中执行耗时操作,只能放在子线程中进行处理,当有新的intent请求过来都会线onStartCommond将其入队列,当第一个耗时操作结束后,就会处理下一个耗时操作(此时调用onHandleIntent),都执行完了自动执行onDestory销毁IntengService服务。

代码地址:戳我戳我


我的Github
我的视频 慕课网




目录
相关文章
|
1月前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
32 2
|
2月前
|
设计模式 前端开发 Android开发
Android应用开发中的MVP架构模式解析
【5月更文挑战第25天】本文深入探讨了在Android应用开发中广泛采用的一种设计模式——Model-View-Presenter (MVP)。文章首先概述了MVP架构的基本概念和组件,接着分析了它与传统MVC模式的区别,并详细阐述了如何在实际开发中实现MVP架构。最后,通过一个具体案例,展示了MVP架构如何提高代码的可维护性和可测试性,以及它给开发者带来的其他潜在好处。
|
1天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
16天前
|
前端开发 JavaScript 测试技术
安卓应用开发中的架构模式解析
【6月更文挑战第21天】在软件开发领域,架构模式是设计优雅、高效、可维护应用程序的基石。本文深入探讨了安卓应用开发中常见的架构模式,包括MVC、MVP、MVVM和Clean Architecture,旨在为开发者提供一个清晰的指导,帮助他们选择最适合自己项目的架构风格。通过对比分析这些架构模式的特点、优势以及适用场景,文章揭示了如何根据项目需求和团队能力来采用恰当的架构模式,以实现代码的可维护性、可扩展性和可测试性。
29 7
|
16天前
|
Java 开发工具 Android开发
安卓与iOS开发差异解析
【6月更文挑战第21天】本文旨在深入探讨安卓和iOS两大移动操作系统在应用开发过程中的主要差异。通过对比分析,揭示各自的设计哲学、编程语言选择、用户界面构建、性能优化策略以及发布流程的异同。文章将提供开发者视角下的实用信息,帮助他们更好地理解各自平台的特点和挑战,从而做出更明智的开发决策。
|
26天前
|
搜索推荐 Android开发 iOS开发
深入解析安卓与iOS操作系统的异同
安卓和iOS是目前两大主流移动操作系统,它们分别代表了开放性和封闭性的设计理念。本文将从系统架构、用户界面、应用生态等方面深入探讨安卓和iOS之间的异同,帮助读者更好地理解这两个操作系统的特点和优势。
41 3
|
11天前
|
Android开发 开发者
“List of Devices Attached“:Android设备连接问题解析
“List of Devices Attached“:Android设备连接问题解析
|
1月前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
21 1
|
1月前
|
XML Java Android开发
04. 【Android教程】Android 工程解析及使用
04. 【Android教程】Android 工程解析及使用
19 0
04. 【Android教程】Android 工程解析及使用
|
2月前
|
API vr&ar 开发工具
构建未来:安卓平台上的AR应用开发全解析
【5月更文挑战第25天】随着增强现实(AR)技术的不断成熟,安卓平台上的AR应用开发正吸引着越来越多的关注。本文深入剖析了在安卓系统上开发AR应用的核心技术和流程,探讨了ARCore SDK的使用、3D渲染技术、用户交互设计以及性能优化等关键要素。通过实例演示和代码分析,揭示了创建高效、沉浸式AR体验的策略和最佳实践,为开发者提供指引,同时对未来AR应用的发展趋势做出展望。

推荐镜像

更多