Android异步加载全解析之IntentService

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 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
我的视频 慕课网




目录
相关文章
|
4月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
6月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
306 2
|
3月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
3月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
4月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
4月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
106 0
|
5月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
64 3
|
5月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
100 6
|
5月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
106 4
|
4月前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
94 0

推荐镜像

更多