IntentService
来源:互联网 发布:中国农大网络远程教育 编辑:程序博客网 时间:2024/05/19 03:42
Service的应用场景:在后台只处理一个请求时比较合适
IntentService的应用场景:service需要处理多个请求,当然处理多个请求是一个比较危险的多线程的场景
1.什么是IntentService
简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。
示例代码:
TestService3.java
publicclass IntentServiceDemo extends IntentService { public IntentServiceDemo() { //必须实现父类的构造方法super("IntentServiceDemo"); } //重写其他方法,用于查看方法的调用顺序 @Overridepublic IBinder onBind(Intent intent) { System.out.println("onBind"); returnsuper.onBind(intent); } @Overridepublicvoid onCreate() { System.out.println("onCreate"); super.onCreate(); } @Overridepublicvoid onStart(Intent intent, int startId) { System.out.println("onStart"); super.onStart(intent, startId); }@Overridepublicint onStartCommand(Intent intent, int flags, int startId) { System.out.println("onStartCommand"); returnsuper.onStartCommand(intent, flags, startId); }@Overridepublicvoid setIntentRedelivery(boolean enabled) { super.setIntentRedelivery(enabled); System.out.println("setIntentRedelivery"); } //必须重写的核心方法 @Overrideprotectedvoid onHandleIntent(Intent intent) { //Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务 String action = intent.getExtras().getString("param"); if (action.equals("oper1")) { System.out.println("Operation1"); }elseif (action.equals("oper2")) { System.out.println("Operation2"); } try { Thread.sleep(2000); //让服务休眠2秒 } catch (InterruptedException e) { e.printStackTrace(); } } @Overridepublicvoid onDestroy() { System.out.println("onDestroy"); super.onDestroy(); } }
AndroidManifest.xml注册下Service
<service android:name=".TestService3" android:exported="false"> <intent-filter > <action android:name="com.test.intentservice"/> </intent-filter> </service>
在MainActivity启动三次服务
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent it1 = new Intent("com.test.intentservice"); Bundle b1 = new Bundle(); b1.putString("param", "s1"); it1.putExtras(b1); Intent it2 = new Intent("com.test.intentservice"); Bundle b2 = new Bundle(); b2.putString("param", "s2"); it2.putExtras(b2); Intent it3 = new Intent("com.test.intentservice"); Bundle b3 = new Bundle(); b3.putString("param", "s3"); it3.putExtras(b3); //接着启动多次IntentService,每次启动,都会新建一个工作线程 //但始终只有一个IntentService实例 startService(it1); startService(it2); startService(it3); } } 打印结果如图:三个异步任务依次排队操作,任务完成后,service自动停止服务。
1 0
- IntentService
- IntentService
- intentservice
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- intentservice
- 红帽CEO:员工经常当面叫我笨蛋
- 一个解决OpenCV ffmpeg的链接错误的解决方法
- RHEL6 命令行下安装图形桌面
- aop自定义切面
- 第五周项目1.4-三角形类雏形
- IntentService
- How to build qemu-system-arm in Linux
- Activity 的 LaunchMode
- ARM汇编调试
- Using QEMU for Embedded Systems Development, Part 1
- Using QEMU for Embedded Systems Development, Part 2
- C#委托的介绍(delegate、Action、Func、predicate)
- Using QEMU for Embedded Systems Development, Part 3
- I need to learn ARM assembly, and I use Linux.