Android面经(11/30)IntentService
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看(承诺免费售后答疑):《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看(承诺免费售后答疑):《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看(承诺免费售后答疑):《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看(承诺免费售后答疑):《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法和配置,制作Gradle插件,请看(承诺免费售后答疑):《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;
网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!
正文开始⬇
曾遇到过面试官不问Service的面试题,直接问是否用过IntentService,此时如果能说上几句,一定可以给自己加分。面试官可能会问:
- IntentService是什么?⭐⭐⭐⭐⭐
- IntentService原理和使用场景?⭐⭐⭐⭐
- IntentService和Service的区别 ⭐⭐⭐⭐⭐
看完以下的解析,一定可以让面试官眼前一亮。
目录
- 1、HandlerThread是什么?
- 2、IntentService的使用
- 3、源码分析
- 4、Service 与 IntentService 的区别
- 5、使用场景
1、IntentService是什么?
回顾Android实现线程异步的方法,有AsyncTask、HandlerThread、线程池、IntentService。其中IntentService其实是继承与Service的类,内部是由HandlerThread实现(HandlerThread本系列由专门的小节做介绍,不清楚的童鞋可以去看看)。常用于处理异步请求,处理完子线程的耗时操作后,会自动执行stopService()。
2、IntentService的使用
我们用IntentService来实现在后台读取文件已经下载文件,直接上demo:
// XuruiIntentService.java
public class XuruiIntentService extends IntentService {
private static final String TAG = "XuruiIntentService";
public XuruiIntentService() {
//IntentService 工作线程的名字
super("XuruiIntentService");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (intent != null) {
String taskName = intent.getStringExtra("taskName");
switch (taskName) {
case "readFile": //1
//任务一:执行读取大文件内容的耗时操作
try {
readFile();
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case "DownLoad": //2
//任务二:执行从网络下载文件的耗时操作
break;
default:
break;
}
}
}
}
// Activity中使用XuruiIntentService类
public void onClick(View v) {
Intent intent = new Intent(this, XuruiIntentService.class);
switch (v.getId()) {
case R.id.readFileBtn: //3
intent.putExtra("taskName", "readFile");
startService(intent);
break;
case R.id.downLoadBtn: //4
intent.putExtra("taskName", "DownLoad");
startService(intent);
break;
default:
break;
}
}
上面的demo还是比较好理解的,在注释3按下读取文件的按钮后,就会通过startService()启动服务,跑到注释1去执行耗时的文件读取操作。没错,IntentService的启动和Service的启动是一样的。
还有一点需要注意,如果按下readFileBtn后马上按downLoadBtn,那么代码执行的顺序是: onCreate、onStartCommand、onHandleIntent: readFile、onStartCommand、onHandleIntent: DownLoad、onDestroy
但如果按下readFileBtn后稍等一会再按downLoadBtn,那么代码执行的顺序是: onCreate、onStartCommand、onHandleIntent: task1、readFile、 onCreate、onStartCommand、onHandleIntent: task2、DownLoad
以上两种情况证明了,IntentService在处理完操作后,会自动退出,因此按下readFileBtn后稍等一会再按downLoadBtn,会重新拉起一个新的服务,从onCreate()开始执行。
注:不能用bindService()来绑定IntentService,因为onBind()默认返回null。
3、源码分析
因为内部使用HandlerThread实现,源码也才100+行,因此直接copy完整的源码,不做任何删减(下面源码是android9.0.0的源码)。
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile Ser
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。