文档章节

Android之Service与IntentService的比较

带梦想一7飞
 带梦想一7飞
发布于 2014/01/16 18:38
字数 1312
阅读 172
收藏 20
不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得。

    首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方:

      1.A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.

      2.A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).

      稍微翻一下(英文水平一般大笑)

      1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。

      2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作

关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现Application Not Responding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。

       有人肯定会问,那么为什么我不直接用Thread而要用Service呢?关于这个,大家可以网上搜搜,这里不过多解释。有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。 

       IntentService相对于Service来说,有几个非常有用的优点,首先我们看看官方文档的说明:

         IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests throughstartService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

         This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

         All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.

            稍微翻译理一理,这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。下面给一个小例子:

       1.Service:

  1. package com.zhf.service; 
  2.  
  3. import android.app.Service; 
  4. import android.content.Intent; 
  5. import android.os.IBinder; 
  6.  
  7. public class MyService extends Service { 
  8.  
  9.     @Override 
  10.     public void onCreate() { 
  11.         super.onCreate(); 
  12.     } 
  13.      
  14.     @Override 
  15.     public void onStart(Intent intent, int startId) { 
  16.         super.onStart(intent, startId); 
  17.         //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作 
  18.         System.out.println("onStart"); 
  19.         try
  20.             Thread.sleep(20000); 
  21.         } catch (InterruptedException e) { 
  22.             e.printStackTrace(); 
  23.         } 
  24.         System.out.println("睡眠结束"); 
  25.     } 
  26.      
  27.     @Override 
  28.     public IBinder onBind(Intent intent) { 
  29.         return null
  30.     } 

package com.zhf.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {

	@Override
	public void onCreate() {
		super.onCreate();
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作
		System.out.println("onStart");
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("睡眠结束");
	}
	
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
}

           2.IntentService:

  1. package com.zhf.service; 
  2.  
  3. import android.app.IntentService; 
  4. import android.content.Intent; 
  5.  
  6. public class MyIntentService extends IntentService { 
  7.  
  8.     public MyIntentService() { 
  9.         super("yyyyyyyyyyy"); 
  10.     } 
  11.  
  12.     @Override 
  13.     protected void onHandleIntent(Intent intent) { 
  14.         // 经测试,IntentService里面是可以进行耗时的操作的 
  15.         //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent 
  16.         //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个 
  17.         System.out.println("onStart"); 
  18.         try
  19.             Thread.sleep(20000); 
  20.         } catch (InterruptedException e) { 
  21.             e.printStackTrace(); 
  22.         } 
  23.         System.out.println("睡眠结束"); 
  24.     } 

package com.zhf.service;

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

public class MyIntentService extends IntentService {

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

	@Override
	protected void onHandleIntent(Intent intent) {
		// 经测试,IntentService里面是可以进行耗时的操作的
		//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent
		//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
		System.out.println("onStart");
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("睡眠结束");
	}
}


测试主程序:

  1. package com.zhf.service; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Intent; 
  5. import android.os.Bundle; 
  6.  
  7. public class ServiceDemoActivity extends Activity { 
  8.     /** Called when the activity is first created. */ 
  9.     @Override 
  10.     public void onCreate(Bundle savedInstanceState) { 
  11.         super.onCreate(savedInstanceState); 
  12.         setContentView(R.layout.main); 
  13.         startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding 
  14.         //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理) 
  15.         startService(new Intent(this,MyIntentService.class)); 
  16.         startService(new Intent(this,MyIntentService.class)); 
  17.     } 

本文转载自:http://blog.csdn.net/zhf198909/article/details/6906786

共有 人打赏支持
下一篇: 快排class
带梦想一7飞
粉丝 19
博文 190
码字总数 99203
作品 0
朝阳
私信 提问
加载中

评论(1)

myoschinavip
myoschinavip
学习了。。
Android 异步编程

文章作者:朱鸿,淘宝资深架构师 原文出处:http://hugozhu.myalert.info/2014/06/29/46-async-android.html Android的线程和内存模型 Android操作系统在boot后,会启动一个Zygote(受精卵)进...

鉴客
2014/07/01
1K
1
android service 的各种用法(IPC、AIDL)

最近在学android service,感觉终于把service的各种使用场景和用到的技术整理得比较明白了,受益颇多,在此记录一下! service的主要功能如下: a. 执行需要长时间运行的操作,这个操作不与用...

wangxigui
2013/05/21
0
3
Android面试必会知识点 - ANR详解

最近在公司出差过多,感觉自己快被废了,这时候正好有大公司给了面试机会,于是就去试试,虽然最后Tencent没有要我,但是过程中让我对Android有了更新的认知,把我的对于Android的理解又提升...

吴雨声
2018/07/02
0
0
Android中Service与IntentService的使用比较

该博客来自网络——————>> 稍微翻译理一理,这里主要是说IntentServic 不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个I...

crystaltiger
2013/09/09
0
0
dialog以及aidl杂谈

在使用progressDialog是进场会出现这种情景就是通过handler在子线程中进行转菊花或者其他的dialog的操作,当完成某种标志后,进而将菊花消失dismiss(),但是在dismiss的时候如果处理不当可能会...

找到组织
2013/12/12
430
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue.js开发环境搭建说明(mac)

vue开发环境搭建(mac) 投影放大:cmd + + 安装Node 下载Node 官网下载 https://nodejs.org/en/download/ 安装Node 双击安装包,选择安装目录,比如: /usr/local/bin 安装成功后最好记录一...

Danni3
6分钟前
0
0
Qt编写自定义控件3-速度仪表盘

前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业...

飞扬青云
11分钟前
0
0
【论文阅读】Image Super-Resolution via Deep Recursive Residual Network

题目:通过深度递归残差网络实现图像的超分辨率 摘要: 近年来,基于卷积神经网络的模型在单张图像的超分辨率上已经取得了巨大的成功。由于深度网络的强大,这些CNN模型学习了从低分辨率输入...

云烟成雨forever
13分钟前
0
0
为什么强烈建议大家使用枚举来实现单例

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

群星纪元
32分钟前
10
0
Confluence 6 超过当前许可证期限进行升级

这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况。 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似下面的错误提...

honeymoose
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部