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 我的视频 慕课网

Android异步载入全解析之IntentService的更多相关文章

  1. Android异步载入全解析之使用多线程

    异步载入之使用多线程 初次尝试 异步.异步,事实上说白了就是多任务处理.也就是多线程执行.多线程那就会有各种问题,我们一步步来看.首先.我们创建一个class--ImageLoaderWithoutC ...

  2. Android异步载入全解析之大图处理

    Android异步载入全解析之大图处理 异步载入中很重要的一部分就是对图像的处理,这也是我们前面用异步载入图像做示例的原因. 一方面是由于图像处理不好的话会很占内存,并且easyOOM,还有一方面,图 ...

  3. Android异步载入全解析之使用AsyncTask

    Android异步载入全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅能够对并发线程进行管理.更能够提高他们运行的效率.优化整个App.当然我们能够自己 ...

  4. Android异步载入全解析之开篇瞎扯淡

    Android异步载入 概述 Android异步载入在Android中使用的很广泛,除了是由于避免在主线程中做网络操作.更是为了避免在显示时由于时间太长而造成ANR,添加显示的流畅性,特别是像List ...

  5. Android异步载入AsyncTask具体解释

    曾看见有人说过.认为非常有道理.分享一下:   技术分为术和道两种:   (1)具体做事的方法是术.   (2)做事的原理和原则是道. 近期项目发现个重大问题.结果打log跟踪查是AsyncTask导 ...

  6. Android 异步消息处理机制解析

    Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue.Looper.下面将会对这四个部分进行一下简要的介绍. 1. Message: Messa ...

  7. Android系统启动过程全解析

    Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程. 从内核之上,我们首先应该从文件系统的init开始,因为 ini ...

  8. Android异步载入学习笔记之四:利用缓存优化网络载入图片及ListView载入优化

    假设不做不论什么处理.直接用网络载入图片在网速快的情况下可能没什么不好的感觉.可是假设使用移动流量或是网络不好的时候.问题就来了,要么用户会抱怨流量使用太多.要么抱怨图片载入太慢.如论从哪个角度出发, ...

  9. Eclipse,到了说再见的时候了——Android Studio最全解析

    转自:http://blog.jobbole.com/77635/ 去年的Google大会上,Google带给我们一个小玩具——Android Studio,说它是玩具,是因为它确实比较菜,界面过时, ...

随机推荐

  1. swift学习一:介绍,开发文档下载

    在今天wwdc2014公布会上.苹果今天公布了全新的编程语言Swift以及新版Xcode.对于开发人员来说,Swift包括了非常多开发人员喜欢的功能,能够与Objective-C和C语言共同工作.Sw ...

  2. FREESWITCH SEESION

    SESSION SESSION为FS的核心概念之一,所以需要拿出来专门的分析下. 从以下几个方面进行分析,结构类型,资源的管理,对于呼叫的意义,规格. 1.结构类型 每一次呼叫会申请一个session ...

  3. 初识google多语言通信框架gRPC系列(一)概述

    gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵 ...

  4. 程序设计实践C++ 程序代写(QQ 928900200)

    程序设计实践 采用C++作为编程语言. 设计开发一个“学生信息”管理系统.该系统模拟数据库管理系统(DBMS)的功能,为用户提供数据存储.查找的能力. 该系统存储的学生信息包括: 学号.姓名.性别.语 ...

  5. Linux 下 Error: Could not find or load main class Hello

    在linux下写了一个很easy的Hello world程序,编译执行居然报错:Error: Could not find or load main class Hello 最后发现是CLASSPAT ...

  6. IIS的WebGarden、WebFarm和StateServer

    开启IIS的WebGarden.WebFarm和StateServer之旅 前言 公司系统虽然配置有1台NLB后拖4台App Server最后搭一台强劲无比的DB Server,但每天下午4点左右总被 ...

  7. 丢弃重口味的xml配置--spring4用groovy配置bean(转)

    spring4之前,bean的配置可以主要分为两种方式,一种是使用基于xml,个人非常讨厌这种方式,因为明明一件很简单的事,放在xml中就会多了不少繁杂的信息.另一种方式,是从spring3.0开始, ...

  8. 插入排序java

    插入排序简述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据.   第一个元素是有序队列,从第二个元素开始向有序队列中插入,插入完成后将第三个元素向 ...

  9. WPF中的三维空间(1)

    原文:WPF中的三维空间(1) WPF中可以创建三维几何图形,支持3D对象的应用,支持从3D Max等软件将3D文件obj导入设计中,但是目前还不支持将材质同时导入,这样需要在WPF中对3D对象重新设 ...

  10. Linux高性能server规划——多进程编程

    多进程编程 多进程编程包含例如以下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及怎样避免僵尸进程 进程间通信(Inter-Process Communic ...