一.IntentService的基本概念

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

二.开启代码之旅

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

package com.nyl.intentservicesummarize;

import android.app.IntentService;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log; /**
* Created by Administrator on 2017/3/4 0004.
*/ public class ServiceTest extends IntentService{ private static final String TAG = ServiceTest.class.getSimpleName(); //必须实现父类的构造方法
public ServiceTest() {
super("aa");
} /**
* 必须重写的核心方法
* @param intent
*/
@Override
protected void onHandleIntent(Intent intent) {
//Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
String action = intent.getExtras().getString("param");
if (action.equals("s1")) {
Log.i(TAG,"启动第一个service");
}else if (action.equals("s2")){
Log.i(TAG,"启动第二个service");
}else if (action.equals("s3")){
Log.i(TAG,"启动第三个service"); try {
//让服务休眠2秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} } } /**
* 重写其他方法,用于查看方法的调用顺序
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind");
return super.onBind(intent);
} @Override
public void onCreate() {
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand");
return super.onStartCommand(intent, flags, startId);
} @Override
public void setIntentRedelivery(boolean enabled) {
super.setIntentRedelivery(enabled);
Log.i(TAG,"setIntentRedelivery");
} @Override
public void onDestroy() {
Log.i(TAG,"onDestroy");
super.onDestroy();
}
}

  AndroidManifest.xml注册下Service

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

package com.nyl.intentservicesummarize;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnStartIntentService; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnStartIntentService = (Button) findViewById(R.id.btnStartIntentService);
btnStartIntentService.setOnClickListener(this);
} @Override
public void onClick(View view) {
if (view.getId() == R.id.btnStartIntentService){ /**
* 有些时候我们使用Service的时需要采用隐私启动的方式,
* 但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,
* 也就是说从Lollipop开始,service服务必须采用显示方式启动。
* 解决方法: 设置Intent的Action和packageName
*/
Intent it1 = new Intent();
it1.setAction("com.test.intentservice");
it1.setPackage(getPackageName());
Bundle b1 = new Bundle();
b1.putString("param", "s1");
it1.putExtras(b1); Intent it2 = new Intent("com.test.intentservice");
it2.setPackage(getPackageName());
Bundle b2 = new Bundle();
b2.putString("param", "s2");
it2.putExtras(b2); Intent it3 = new Intent("com.test.intentservice");
it3.setPackage(getPackageName());
Bundle b3 = new Bundle();
b3.putString("param", "s3");
it3.putExtras(b3); //接着启动多次IntentService,每次启动,都会新建一个工作线程
//但始终只有一个IntentService实例
startService(it1);
startService(it2);
startService(it3);
}
} }

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

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

最新文章

  1. mysql笔记(存储引擎)
  2. linux如何修改文件或目录的权限(chmod)
  3. robotframework笔记26
  4. MacOSX快捷键
  5. ASP.NET 之 网页快照 (DrawToBitmap)
  6. matlab 中保存某几个变量
  7. bzoj2946 [Poi2000]公共串(SA,SAM)
  8. python——进程、线程、协程
  9. CSS 样式书写规范+特殊符号
  10. Redis 学习开发笔记
  11. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]
  12. [LSGDOJ1822]书架 Splay
  13. 学习经验分享(最近听了一节Java公开课)
  14. C# 获取版本号
  15. 看到一个简单的背单词java程序的设计,收藏下
  16. Python初学(1)
  17. angular 2 - 002 - 基本概念和使用
  18. java 代码获取视频时长
  19. ☆C++学习心得
  20. Deep Learning(深度学习)学习笔记整理系列 一

热门文章

  1. conditon_variable(条件变量)用于线程间同步
  2. c/c++面试12-18------关与sizeof那些事儿
  3. python数据分析笔记中panda(2)
  4. 20个Flutter实例视频教程-第13节: 展开闭合案例
  5. C#操作cmd
  6. SQL——基础概念
  7. Struts2 基础典型应用
  8. C++ STL map使用
  9. Go语言之父谈Go:大道至简
  10. P5137 polynomial(分治)