IntentService有何优点?

本文解析了Android中的IntentService组件,强调其通过队列处理任务且不阻塞主线程的特点,并通过对比Service展示了IntentService处理耗时任务的优势。

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

IntentService有何优点?
 

IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。

下面就来测试一下:

1.Service:


package com.zhf.service;
import Android.app.Service;
import Android.content.Intent;
import Android.os.IBinder;
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;
}
}


2.IntentService:


package com.zhf.service;

import Android.app.IntentService;
import Android.content.Intent;

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("睡眠结束");
}
}


测试主程序:


package com.zhf.service;

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;

public class ServiceDemoActivity extends Activity {

@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));
}
}

原文链接:http://www.linuxidc.com/Linux/2011-10/46075p2.htm

IntentService是Android中的一个特殊Service,它主要用于在后台执行异步任务,处理Intent请求,并在任务完成后自动停止。 以下是IntentService的几个优点: 1. 简化了异步任务的处理IntentService封装了异步任务的处理逻辑,使得开发者可以更加专注于实现具体的任务逻辑,而无需关注线程管理和任务调度等细节。它通过创建一个单独的工作线程来处理任务,避免了在主线程中执行耗时操作导致的ANR(Application Not Responding)问题。 2. 自动停止:IntentService在任务执行完成后会自动停止,无需手动调用stopSelf()方法来停止Service。这样可以避免Service长时间运行而消耗系统资源。 3. 顺序执行:IntentService会按照任务的顺序依次处理Intent请求,确保每个Intent请求都能被正确处理。每次处理一个Intent请求时,它会将其他Intent请求放入队列中等待处理,保证了任务的顺序性。 4. 线程安全:IntentService内部使用单个工作线程来处理任务,因此避免了多线程并发访问的问题。这样可以简化任务的编写,并减少并发导致的竞态条件和同步问题。 5. 可以与其他组件进行通信:IntentService可以通过广播、回调或发送消息等方式与其他组件进行通信,便于任务的状态更新、结果的传递等。 需要注意的是,IntentService适用于执行一系列相对独立的任务,每个任务都是通过Intent进行触发和处理的。如果需要执行长时间运行的任务或与UI交互的任务,可能需要考虑其他方式,如使用HandlerThread或AsyncTask等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值