美文网首页
【Android组件内核面试题】Service和Thread的区

【Android组件内核面试题】Service和Thread的区

作者: 小城哇哇 | 来源:发表于2023-11-28 22:07 被阅读0次

Service和Thread的区别?

这道题想考察什么?
  1. 是否了解Service与Thread真实场景使用,是否熟悉Service与Thread使用场景?
考察的知识点
  1. Service与Thread在项目中使用与基本知识
考生应该如何回答
1.请你说下Service和Thread之间的关系在你开发中如何使用的,并说说你的理解?

答:

面试官是这样的,Service和Thread之间没有一点关系,之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。

第一点:Thread,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。

第二点:Service我们最初理解的时候,总以为它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。

但是,如果我告诉你Service其实是运行在主线程里的,你肯定不会认为它和Thread有关

例如:①:在MainActivity的onCreate()方法里添加一行打印当前线程id的语句:

Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId());  

例如:②:然后在MyService的onCreate()方法里也添加一行打印当前线程id的语句:

Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId());  

例如:③:3、现在重新运行一下程序,并点击Start Service按钮,会看到如下打印日志:

image.png

鉴于上面的日志打印,会发现它们的线程id是完全一直的,由此证实了Service是运行在主线程里的,也就是说如果你在Service里编写了s十分耗时的代码,程序必定会出现ANR的

既然如此,那我要Service有什么用呢? 其实这是两个完全不同的概念。

第三点:Android的后台就是指,它的运行是完全不依赖UI的,即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会想,前面不是刚刚验证过Service是运行在主线程里的吗?在这里如果一直执行着心跳连接,就不会阻塞主线程的运行吗?答案是肯定的,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了

问题来了:既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?

答:

原因一:这是因为Activity十分难对Thread进行控制,当Activity被销毁之后,就没有其它的办法可以再重新获取到之前创建的子线程的实例。

原因二:而且在一个Activity中创建的子线程,其他Activity无法对其进行操作。

所以Service就不同了,所有的Activity都可以与Service进行绑定,然后可以很方便地操作当中的方法,即使Activity被销毁了,之后只要重新建立与Service的关联,就又能够获取到之前的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不用担心无法对后台任务进行控制的情况

所以这也是为什么在开发过程中,Service都需要配合Thread的原因,请看下面代码:

@Override  
public int onStartCommand(Intent intent, int flags, int startId) {  
    new Thread(new Runnable() {  
        @Override  
        public void run() {  
            // 开始执行后台任务  
        }  
    }).start();  
    return super.onStartCommand(intent, flags, startId);  
}  

class MyBinder extends Binder {  

    public void startDownload() {  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                // 执行具体的下载任务  
            }  
        }).start();  
    }  
} 
2.面试官提问:为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了

面试者回答:

第一点:Thread:Thread 是程序执行的最小单元,它是CPU分配的基本单位。可以用 Thread 来执行一些异步的操作。

第二点:Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 看成线程,它跟线程是没有关系的。

因此你可以把 Service 想象成一种消息服务,而你可以在存在 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来操作它,当然这些都是 Thread 做不到的


最后

有需要面试题的朋友可以关注一下哇哇,以上都可以分享!!!

相关文章

网友评论

      本文标题:【Android组件内核面试题】Service和Thread的区

      本文链接:https://www.haomeiwen.com/subject/gcpxgdtx.html