这又一个面试题,笔者被问到后有点懵,毕竟之前压根就没思考过这个问题,在笔者看来,这两者好像除了都可以用来执行任务外,压根就是风马牛不相及。所以,现场发挥,真心说的不咋滴!今天我们就来细说一下这两者的区别。
1)Service是Android的四大组件之一(好吧,这是一句废话)
2)Sevice和Thread都有各自的生命周期(又是一句废话)
3)Thread由本应用程序托管,是程序执行的最小单元,它是分配CPU的基本单位
4)Sevice由系统进程托管(ServiceManager),通信类似于client和server(C/S),是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc
5)若不新建线程的话,Android的四大组件都是运行在main线程中的,所以service也是如此,但如果你用过IntentService的话,在onHandleIntent方法中的却不是main线程,那是因为IntentService中使用了HandlerThread新建了线程(详见:IntentService原理详解),另外,如果是Local Service,运行在主进程的main线程中;如果是Remote Service,则运行在对应进程的main线程中。
6)Thread在四大组件中start之后,就不再依赖于四大组件而存在了,举个简单的例子:你在一个activity启动了一个Thread,而后如果activity被销毁了,但如果Thread任务未执行完毕,它仍然得以继续运行,我们的activity已经失去了对该Thread的控制。
7)我们无法在不同的activity对同一Thread进行控制,但我们可以在不同的activity对同一Service进行控制,这都得益于Service属于Android的四大组件之一,我们可以在任何有 Context 的地方调用Context.startService、Context.stopService、Context.bindService,Context.unbindService来控制它。举一个简单的例子:你在ActivityA中启动了Service1,然后你在ActivityB中再次启动了Service1,然后你再在ActivityC中停止了Service1,这完全没问题的,因为从始至终,系统只会存在着同一个Service1对象而已。
8)如果你需要长时间在后台运行,且获得更好的控制权的话,建议使用Service;
如果你只是单纯的执行某单一任务或多个任务的话,可以使用Thread;
当然,我想更多的时候会使用到的是Service+Thread的方式,毕竟后台执行任务的话,更多情况我们不希望占用到main线程,最典型的例子就是上面说到的:IntentService
网友评论