IntentService 与 Service的区别:(service(不是单独进程和应用程序同进程)intentService(是一个处理异步请求类,专处理耗时任务))
Service
是长期运行在后台的应用程序组件
。
Service
不是一个单独的进程,它和应用程序在同一个进程中,
Service 也不是一个线程,它和线程没有任何关系,所以它不能直接处理耗时操作。
如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗时操作就必须开启一个单独的线程来处理
IntentService
是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,
启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,
IntentService 会自动停止
,而不需要我们去手动控制。
另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,
并且,每次只会执行一个工作线程,执行完第一个再执行第二个,
有序执行
IntentService :使用场景——
(分析源码得下面)
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,
启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。
另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
IntentService与Service的不同:
(1)直接 创建一个默认的工作线程,该线程执行所有的intent传递给onStartCommand()区别于应用程序的主线程。
(2)直接创建一个工作队列,将一个意图传递给你onHandleIntent()的实现,所以我们就永远不必担心多线程。
(3)当请求完成后自己会调用stopSelf(),所以你就不用调用该方法了。
(4)提供的默认实现onBind()返回null,所以也不需要重写这个方法。so easy啊
(5)提供了一个默认实现onStartCommand(),将意图工作队列,然后发送到你onHandleIntent()实现。真是太方便了
我们需要做的就是实现onHandlerIntent()方法,还有一点就是经常被遗忘的,构造函数是必需的。
简单说呢?第一,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service
IntentService 实现
/**
* Created by Android Studio.
* IntentService 服务 需要在mannifest 离注册
<service android:name=".service.MyIntentService"/>
*
@author
zjx
*
@date
2020/4/10
*/
public class
MyIntentService
extends
IntentService {
public
MyIntentService() {
super
(
"MyIntentService"
);
}
@Override
protected void
onHandleIntent(
@Nullable
Intent intent) {
//要执行代码模块
//在这里添加我们要执行的代码,Intent中可以保存我们所需的数据,
//每一次通过Intent发送的命令将被顺序执行
Log.
v
(
"TAG"
,
"已开启服务"
);
}
@Override
public void
onDestroy() {
super
.onDestroy();
}
}
Service 实现:
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;
}
}