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
原创粉丝点击