本文摘自网络,以及自己的理解
1、关于Service:
1、service是安卓四大组件之一
2、应为Service是运行在主线程中的,所以不能在Service中进行耗时操作
3、如果确实需要进行耗时操作,建议在Service中新启线程完成
2、关于IntentService
IntentService是Service类的子类,用来处理异步请求。
客户端可以通过startService(Intent)方法传递请求给
IntentService
。
IntentService
在
onCreate()
函数中通过
HandlerThread
单独开启一个线程来处理所有Intent请求对象(通过startService的方式发送过来的)所对应的任务,这样以免事务处理阻塞主线程。
执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则执行下一个Intent请求所对应的任务。
IntentService在处理事务时,还是采用的Handler方式,创建一个名叫
ServiceHandler
的内部Handler,并把它直接绑定到
HandlerThread所对应的子线程。
ServiceHandler把处理
一个intent所对应的事务都封装到叫做
onHandleInten
t的虚函数;因此我们直接实现
虚函数
onHandleIntent
,再在里面根据Intent的不同进行不同的事务处理就可以了。
另外,
IntentService默认实现了Onbind()方法,返回值为null。
使用IntentService需要两个步骤:
1
、写构造函数
2
、
实现
虚函数
onHandleIntent
,并在里面根据Intent的不同进行不同的事务处理就可以了。
好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求
注意:
IntentService的构造函数一定是参数为空的构造函数,然后再在其中调用
super("name")这种形式的构造函数。
因为Service的实例化是系统来完成的,而且系统是用
参数为空的
构造函数来
实例化
Service的
3、使用案例
前言:
1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。
2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作
关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现Application Not Responding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。
有人肯定会问,那么为什么我不直接用Thread而要用Service呢?(线程优先级问题)有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。
IntentService相对于Service来说,有几个非常有用的优点,
使用队列的方式将请求的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 {
- /** 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(ANR)
-
- 实验二: startService(new Intent(this,MyIntentService.class));
- startService(new Intent(this,MyIntentService.class));
- 结果分析:连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)
- }
- }
|
|