一.IntentService的基本概念

IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。那么,用IntentService有什么好处呢?首先,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service,第三,it's so easy to use!

二.开启代码之旅

  OK!接下看看如何去使用,新建工程,新建一个继承IntentService的类,代码如下:

  1. package com.nyl.intentservicesummarize;
  2.  
  3. import android.app.IntentService;
  4. import android.content.Intent;
  5. import android.os.IBinder;
  6. import android.util.Log;
  7.  
  8. /**
  9. * Created by Administrator on 2017/3/4 0004.
  10. */
  11.  
  12. public class ServiceTest extends IntentService{
  13.  
  14. private static final String TAG = ServiceTest.class.getSimpleName();
  15.  
  16. //必须实现父类的构造方法
  17. public ServiceTest() {
  18. super("aa");
  19. }
  20.  
  21. /**
  22. * 必须重写的核心方法
  23. * @param intent
  24. */
  25. @Override
  26. protected void onHandleIntent(Intent intent) {
  27. //Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
  28. String action = intent.getExtras().getString("param");
  29. if (action.equals("s1")) {
  30. Log.i(TAG,"启动第一个service");
  31. }else if (action.equals("s2")){
  32. Log.i(TAG,"启动第二个service");
  33. }else if (action.equals("s3")){
  34. Log.i(TAG,"启动第三个service");
  35.  
  36. try {
  37. //让服务休眠2秒
  38. Thread.sleep(2000);
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42.  
  43. }
  44.  
  45. }
  46.  
  47. /**
  48. * 重写其他方法,用于查看方法的调用顺序
  49. * @param intent
  50. * @return
  51. */
  52. @Override
  53. public IBinder onBind(Intent intent) {
  54. Log.i(TAG,"onBind");
  55. return super.onBind(intent);
  56. }
  57.  
  58. @Override
  59. public void onCreate() {
  60. super.onCreate();
  61. }
  62.  
  63. @Override
  64. public int onStartCommand(Intent intent, int flags, int startId) {
  65. Log.i(TAG,"onStartCommand");
  66. return super.onStartCommand(intent, flags, startId);
  67. }
  68.  
  69. @Override
  70. public void setIntentRedelivery(boolean enabled) {
  71. super.setIntentRedelivery(enabled);
  72. Log.i(TAG,"setIntentRedelivery");
  73. }
  74.  
  75. @Override
  76. public void onDestroy() {
  77. Log.i(TAG,"onDestroy");
  78. super.onDestroy();
  79. }
  80. }

  AndroidManifest.xml注册下Service

  在MainActivity启动三次服务,代码如下:

  1. package com.nyl.intentservicesummarize;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8.  
  9. public class MainActivity extends Activity implements View.OnClickListener {
  10.  
  11. private Button btnStartIntentService;
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17.  
  18. btnStartIntentService = (Button) findViewById(R.id.btnStartIntentService);
  19. btnStartIntentService.setOnClickListener(this);
  20. }
  21.  
  22. @Override
  23. public void onClick(View view) {
  24. if (view.getId() == R.id.btnStartIntentService){
  25.  
  26. /**
  27. * 有些时候我们使用Service的时需要采用隐私启动的方式,
  28. * 但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,
  29. * 也就是说从Lollipop开始,service服务必须采用显示方式启动。
  30. * 解决方法:
  31.  
  32. 设置Intent的Action和packageName
  33. */
  34. Intent it1 = new Intent();
  35. it1.setAction("com.test.intentservice");
  36. it1.setPackage(getPackageName());
  37. Bundle b1 = new Bundle();
  38. b1.putString("param", "s1");
  39. it1.putExtras(b1);
  40.  
  41. Intent it2 = new Intent("com.test.intentservice");
  42. it2.setPackage(getPackageName());
  43. Bundle b2 = new Bundle();
  44. b2.putString("param", "s2");
  45. it2.putExtras(b2);
  46.  
  47. Intent it3 = new Intent("com.test.intentservice");
  48. it3.setPackage(getPackageName());
  49. Bundle b3 = new Bundle();
  50. b3.putString("param", "s3");
  51. it3.putExtras(b3);
  52.  
  53. //接着启动多次IntentService,每次启动,都会新建一个工作线程
  54. //但始终只有一个IntentService实例
  55. startService(it1);
  56. startService(it2);
  57. startService(it3);
  58. }
  59. }
  60.  
  61. }

  代码之路已经完成了,我们来看看打印的结果吧,如下图:

  关于IntentService的内容总结暂时就这么多,文章如果有写得不对的地方,欢迎广大园友指正!

Android学习总结(三)——IntentService的用法的更多相关文章

  1. 三、Android学习第三天——Activity的布局初步介绍(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...

  2. Android学习第三天-打包常用命令

    在前面<Android学习第一天-adb常用命令>和 <Android学习第二天-android常用命令>两篇博文中,我们重点讲解了adb和android的常用命令,下面我们讲 ...

  3. 【Android】完善Android学习(三:API 3.0)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  4. Android学习(三)

    学号 20189214 <Android程序开发>第八周学习总结 教材学习内容总结 GridView GridView和ListView一样是AbsListView的子类; 都需要一个Ad ...

  5. android学习笔记三

    GUI==>Graphics User Interface,图形用户界面. android UI 建立在View.ViewGroup基础上,采用组合器设计模式设计View和ViewGoup. V ...

  6. Android学习--持久化(三) SQLite & LitePal

    SQLite & LitePal 自己做为一个iOS开发,看到安卓这一块的时候,那中浓烈的熟悉味道更加强烈,SQLite这种轻量级的关系型数据库的使用在移动端相差不多,iOS有FMDB,And ...

  7. Android学习第三天-签名常用命令

    由于怕篇幅过长,所以把这个打包常用命令分开成两篇博文来进行讲解,下面我们直接进入主题吧. 8.keytool 这是我们JDK自带的密钥和证书管理工具 命令: -certreq 生成证书请求 -chan ...

  8. Android学习笔记三:用Intent串联activity

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7513399.html 一:Intent Intent可以理解为 意图. 我们可以通过创建intent实例来定义 ...

  9. Android学习(三) 自动完成的使用

    1.AutoCompleteTextView 自动完成功能,在文本框中输入字符,会出现匹配的自动提示.类似百度搜索. XML代码 <?xml version="1.0" en ...

  10. Android学习笔记(三)

    ContentProvider简单介绍 ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序须要把自己的数据暴露给其它程序使用时.该应用程序便可通过提供Conten ...

随机推荐

  1. 利用union判断系统的大小端

    int checkCPUendian()//返回1,为小端:反之,为大端: { union { unsigned int a; unsigned char b; }c; c.a = 1; return ...

  2. Java字符串理解

    1. 字符串基本知识 用java.lang.String类的对象表示字符串 字符串类型不是基本类型, 而是引用类型(类似于数组和对象) Java基于Unicode字符集 2. 字符串创建 public ...

  3. Eclipse 安装Maven插件

    这个好: http://www.iteye.com/topic/1123225 其他: 1先安装subeclipse插件就是svn svn - http://subclipse.tigris.org/ ...

  4. 打造个人IP: 开源项目网站构建框架

    前言 您是否正在寻找有关如何创建博客网站: 个人博客 或者 开源项目官网 : Dubbo, Vue.js的构建框架? 在这篇文章我将向您展示如何创建一个美观并且实用的开源博客/开源项目官网构建框架!近 ...

  5. npm切换到淘宝镜像

    1. npm简介 1.1.说明:npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等): 1.2.使用npm安装插件:命令提示符执 ...

  6. layui icon样式1到7

    1: 2: 3: 4: 5: 6: 7:

  7. 跳转到另一个APP

    看看这个代码: http://code4app.com/codesample/4fcc512d6803fae60b000002 inApp跳转,不过需要Nimbus类库. 要跳转到另一个APP,需要另 ...

  8. python的pip管理工具

    Python有两个著名的包管理工具easy_install.py和pip.在Python2.7的安装包中,easy_install.py是默认安装的,而pip需要我们手动安装. 在此进行编译安装pip ...

  9. Yac - PHP扩展

    1:首先你要安装Git [root@localhost]# git clone https://github.com/laruence/yac 2:进入yac目录进行配置 [root@localhos ...

  10. 子div块中设置margin-top时影响父div块位置的解决办法及其原因

    解决办法①: 若子DIV块中使用margin-top,则在父DIV块中添加:overflow:hidden; 解决办法②: 在子DIV块中用padding-top代替margin-top. 有个叫 b ...