IntentService
在实际过程中,我们经常会遇到一些需求,比如在后台加载一些图片,或者下载一些文件,这个时候我们通常就会用到 Service ,但是 service 有个弊端:Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;所以如果我们的 Service 是要为活动服务的。那么在 Service 中建立 线程就显得不那么明智了,于是这个时候 IntentService 就被提出了。
概念
IntentService 是 Service 的基类,可根据需要处理异步请求(表示为 Intent
)。客户端通过Context.startService(Intent)
呼叫发送请求; 根据需要启动服务,使用工作线程依次处理每个Intent,并在工作失败时自行停止。
使用
步骤:
- 建立一个服务类,使它继承自 IntentService
- 建立具体逻辑代码
- 在 Mainfest.xml 中进行注册
这里我结合 广播 给大家举个例子:
一、建立 MyIntentService 类
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
我们很显眼的看到了方法 :onHandleIntent ,让我们看看他的源码
可以看到这是一个非常简单的抽象方法,它的特性:
- 在工作线程上调用此方法并请求处理。一次只处理一个Intent,但处理独立于其他应用程序逻辑运行的工作线程。 因此,如果此代码需要很长时间,它将阻止其他请求 相同的 IntentService,但它不会阻止其他任何东西。 处理完所有请求后,IntentService会自行停止, 所以你不应该致电{@link #stopSelf}。(译)
所以让我们在其中实现具体的逻辑功能
比如这里我添加了一个模拟耗时(下载):
@Override
protected void onHandleIntent(@Nullable Intent intent) {
try {
Thread.sleep(1000);// 模拟初始化耗时
sendIfoToBroadCast("服务正在运行中");
int progressCount = 0;
boolean isRunning = true;
while (isRunning){
progressCount ++;
if (progressCount > 100){
isRunning = false;
}else {
Thread.sleep(50);
sendIfoToBroadCast("下载进度:", progressCount);
}
}
sendIfoToBroadCast("下载完成");
Thread.sleep(1000);// 模拟初始化耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
每隔 50ms 发送一次广播 更新数据
private void sendIfoToBroadCast(String serviceStatus){
Intent intent1 = new Intent(IntentManager.ACTION_TYPE_SERVICE);
intent1.putExtra(IntentManager.INTENT_STATUS_SERVICE, serviceStatus);
manager.sendBroadcast(intent1);
}
private void sendIfoToBroadCast(String serviceStatus, int progressStatus){
Intent intent = new Intent(IntentManager.ACTION_TYPE_THREAD);
intent.putExtra(IntentManager.INTENT_STATUS_SERVICE, serviceStatus);
intent.putExtra(IntentManager.INTENT_PROGRESS_SERVICE, progressStatus);
manager.sendBroadcast(intent);
}
根据刚刚翻译的文档可知:如果这个耗时操作结束,也就是 onHandleIntent 方法调用结束,那么 IntentService 也就会随之结束
private int progressCount = 0;
private boolean isRunning = false;
private LocalBroadcastManager manager;
public MyIntentService() {
super("MyIntentService");
}
@Override
public void onCreate() {
super.onCreate();
manager = LocalBroadcastManager.getInstance(this);
sendIfoToBroadCast("服务启动");
}
@Override
public void onDestroy() {
sendIfoToBroadCast("服务已结束运行");
super.onDestroy();
}
关于广播和活动里的实现详见我的这一篇-> 详键这篇博文 - https://blog.csdn.net/qq_43377749/article/details/90738979
全部详情请一打包 Demo -> https://github.com/FishInWater-1999/android_four_major_components/tree/master/app/src/main/java/com/entry/activitystudy/broadcast
最后的效果:
如果你觉得本篇博文总结的不错,记得给我点赞呦~~ 么么哒~~
六一快乐 啦啦啦