Service和IntentService的区别

本文深入探讨了Android中Service和IntentService的功能区别,重点解释了Service与IntentService的工作机制和适用场景,通过实例展示了如何在不同场景下选择合适的组件进行开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Service和IntentService的区别


1. 首先IntentService是继承自Service;
2. Service不是一个单独的进程,它和应用程序在同一个进程中;
3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作;
4. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,
IntentService会处理完成一个之后在处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。
因此,如果我们如果要在Service里面处理一个耗时的操作,我们可以用IntentService来代替使用。
5. 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。


例子:

使用Service:

public class MyService extends Service {

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作
System.out.println("onStart");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("睡眠结束");
}

@Override
public IBinder onBind(Intent intent) {
return null;
}
}



使用IntentService:

public class MyIntentService extends IntentService {

public MyIntentService() {
super("yyyyyyyyyyy");
}

@Override
protected void onHandleIntent(Intent intent) {
// 经测试,IntentService里面是可以进行耗时的操作的
//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent
//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
System.out.println("onStart");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("睡眠结束");
}
}



调用:

public class ServiceDemoActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding
        //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)
        startService(new Intent(this,MyIntentService.class));
        startService(new Intent(this,MyIntentService.class));
    }
}





Android 开发中,`Service` `IntentService` 都是用来运行后台任务的组件,但它们之间存在显著的区别。下面是详细的对比解释: ### 1. **基本定义** - **Service**: 是一种可以在后台长时间运行的任务组件,但它本身并不开启新的线程,默认是在主线程中执行任务。 - **IntentService**: 是基于 `Service` 的扩展类,它专门为了解决耗时操作问题而设计。每次启动都会创建一个新的工作线程来完成指定的操作,并且当所有任务完成后会自动停止服务。 ### 2. **线程模型** - **Service**: 如果直接在 `Service` 中执行耗时操作(例如网络请求),可能会阻塞 UI 主线程,进而引发 ANR (Application Not Responding) 错误。 - **IntentService**: 自动开启独立的工作线程去处理耗时任务,不会影响到主界面的流畅度。 ### 3. **生命周期控制** - **Service**: 手动开始(`startService`)手动结束(`stopSelf` 或者 `stopService`)需要开发者自行管理其生命周期。 - **IntentService**: 当所有的异步任务都完成后会自动销毁自身实例,因此不需要显式调用 stop 方法。 ### 4. **并发能力** - **Service**: 支持同时处理多个请求(取决于其实现方式),如果采用多线程则需额外注意同步问题。 - **IntentService**: 内部维护了一个工作队列 FIFO 结构,每次只从队列取出一个 intent 并顺序地在一个单独的工作者线程里依次执行完毕后再取下一个直到全部完成为止。 ### 示例代码比较 ```java // Service Example public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId){ // do something in background on main thread return super.onStartCommand(intent, flags, startId); } } // IntentService Example public class MyIntentService extends IntentService{ public MyIntentService() {super("MyIntentService");} @Override protected void onHandleIntent(Intent workIntent) { // Do the task in a worker thread. } } ``` 以上就是两者的主要差异总结了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值