Android面经(11/30)IntentService

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)


嵌入式


本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;

网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!

正文开始⬇

曾遇到过面试官不问Service的面试题,直接问是否用过IntentService,此时如果能说上几句,一定可以给自己加分。面试官可能会问:

  1. IntentService是什么?⭐⭐⭐⭐⭐
  2. IntentService原理和使用场景?⭐⭐⭐⭐
  3. 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高频面试题全解析 文章被收录于专栏

#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论
今天也是学习的一天
点赞 回复 分享
发布于 2022-12-14 19:27 福建
老哥多多更新
点赞 回复 分享
发布于 2022-12-14 19:37 广西
就爱一些干货
点赞 回复 分享
发布于 2022-12-14 19:44 上海

相关推荐

评论
6
11
分享

创作者周榜

更多
牛客网
牛客企业服务