Service 与 Thread 的区别

Service与Thread区别
本文解析了Android中Service与Thread的不同之处。Service作为一种机制,可在不同Activity间共享控制,而Thread独立于Activity运行。通过示例说明如何利用Service解决跨Activity线程控制的问题。

转自:http://www.cnblogs.com/tt_mc/archive/2012/08/10/2632275.html

Service 与 Thread 的区别 

很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下。 

1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 
2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有! 

既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。 

举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。 

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

在 Android 开发中,Service Thread 是两个用于处理后台任务的机制,但它们在用途、生命周期适用场景上有显著的区别。 ### 1. **基本概念用途** Service 是 Android 的四大组件之一,它主要用于执行长时间运行的操作,并且可以在后台持续运行,即使用户切换了应用或者 Activity 被销毁。Service 通常用于执行不需要用户界面直接交互的任务,例如播放音乐、下载文件或处理网络请求[^2]。 Thread 是 Java 中的基本线程类,用于实现并发操作。在 Android 中,Thread 通常用于执行耗时任务,以避免阻塞主线程(UI 线程),从而防止应用出现 ANR(Application Not Responding)错误[^4]。 ### 2. **生命周期管理** Service 的生命周期由系统管理,可以通过 `startService()` 或 `bindService()` 启动。当 Service 被启动后,它会在后台持续运行,直到它自己调用 `stopSelf()` 或者其他组件调用 `stopService()` 来停止它[^3]。 Thread 的生命周期则完全由开发者控制。一旦 Thread 的 `run()` 方法执行完毕,或者开发者主动调用 `interrupt()` 方法,Thread 就会终止。如果 Thread 的创建者(例如一个 Activity)被销毁,而 Thread 仍在运行,那么该 Thread 将继续执行,但无法再被控制,除非手动停止或程序进程被终止[^3]。 ### 3. **线程进程模型** Service 本质上是一个组件,它默认运行在应用的主线程中,因此不能直接在 Service 中执行耗时操作,否则会导致主线程阻塞。通常会在 Service 中启动一个 Thread 来处理耗时任务[^2]。 Thread 则是一个独立的执行单元,它可以运行在自己的线程中,不会阻塞主线程。Thread 的运行是独立的,即使启动它的组件(如 Activity)被销毁,Thread 仍会继续执行,直到其任务完成或被显式中断[^3]。 ### 4. **跨组件通信资源共享** Service 可以通过 `bindService()` 提供绑定接口,允许其他组件(如 Activity)其进行通信交互。这种机制使得多个组件可以共享同一个 Service 实例,并对其进行控制。此外,Service 还可以通过 BroadcastReceiver 接收广播消息,从而实现更灵活的交互方式[^3]。 Thread 不具备跨组件通信的能力。Thread 的生命周期控制范围局限于创建它的组件。如果多个组件需要对同一个后台任务进行控制,Thread 无法满足这一需求,而 Service 则可以很好地解决这个问题[^3]。 ### 5. **适用场景** - **Service** 适用于需要长时间运行、跨组件控制的任务。例如,音乐播放器、后台数据同步服务等。 - **Thread** 适用于执行短期的、不需要跨组件控制的耗时任务。例如,图片加载、数据解析等。 ### 6. **代码示例** 以下是一个简单的 Thread 示例,用于执行耗时任务: ```java class MyThread extends Thread { @Override public void run() { try { sleep(3000); String s = "世界平"; Log.i("Thread方式收到的值是:", s); } catch (InterruptedException e) { e.printStackTrace(); } } } MyThread myThread = new MyThread(); myThread.start(); ``` 而 Service 的使用通常涉及以下几个步骤: ```java public class MyService extends Service { @Override public void onCreate() { super.onCreate(); // 初始化操作 } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 执行后台任务 new Thread(new Runnable() { @Override public void run() { // 耗时操作 } }).start(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 清理资源 } @Override public IBinder onBind(Intent intent) { return null; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值