您的位置:首页 > 移动开发 > Android开发

Android 服务与线程 的区别

2014-12-14 17:58 204 查看
很多人都会问道这样的一个问题:为什么要用服务,为何不用线程呢?

在官方文档里,大家可看到,服务可处理耗时操作的。但,线程也可以啊。。所以,下面,我来给大家讲下服务与线程的区别,来明白什么时候用服务,什么时候该用线程。

首先,要明白一个概念,线程是什么、服务是什么。(关于服务具体也不多讲了,大家可以参考我之前写的安卓组件详讲的内容)

线程(thread):它是程序运行的最小单元,它是分配 cpu 的基本单位。它是由本应用程序托管。

服务(service):是 android 的一种机制,对应的 service 是运行在主线程上的。它是由系统进程托管。它们之间的通信类似于 client 和 server,是一种轻量级的 ipc 通信,这种通信的载体是 binder,它是在 linux 层交换信息的一种 ipc。

说到这里,我给大家举个例子:

Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在
Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。

这就是由于线程由本应用程序托管的结果。

那什么时候用服务,什么时候用线程呢?

1、在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。

同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。

2、如果任务占用CPU时间多,资源大的情况下,要使用线程。

最好的办法是如何做呢?

创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)还有个办法是使用 IntentService,它有什么用呢?它里面自带了子线程,使用它就不用创建新线程了。

对于 IntentService 并不是适应于所有的场景,它的优点显而易见:使用方便,代码简洁,不再需要我们自己像Service里面还要去创建线程;

但由于是单个的worker thread,所以任务需要排队,不适合大多数的多任务情况;(关于
IntentService 我之后会对其详讲。)

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

最后祝大家学习愉快~谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: