intentService

本文摘自网络,以及自己的理解


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方法:

 

  1. package com.zhf.service;
  2. import Android.app.Service;
  3. import Android.content.Intent;
  4. import Android.os.IBinder;
  5. public class MyService extends Service {
  6.  @Override
  7.  public void onCreate() {
  8.  super.onCreate();
  9. }
  10.  @Override
  11.  public void onStart(Intent intent, int startId) {
  12.  super.onStart(intent, startId);
  13.  //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作
  14. System.out.println("onStart");
  15.  try {
  16. Thread.sleep(20000);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. System.out.println("睡眠结束");
  21. }
  22.  @Override
  23.  public IBinder onBind(Intent intent) {
  24.  return null;
  25. }
  26. }

 

2.IntentService方法:

 

  1. package com.zhf.service;
  2. import Android.app.IntentService;
  3. import Android.content.Intent;
  4. public class MyIntentService extends IntentService {
  5.  public MyIntentService() {
  6.  super("yyyyyyyyyyy");
  7. }
  8.  @Override
  9.  protected void onHandleIntent(Intent intent) {
  10.  // 经测试,IntentService里面是可以进行耗时的操作的
  11.  //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent
  12.  //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
  13. System.out.println("onStart");
  14.  try {
  15. Thread.sleep(20000);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println("睡眠结束");
  20. }
  21. }

测试主程序:

 

  1. package com.zhf.service;
  2. import Android.app.Activity;
  3. import Android.content.Intent;
  4. import Android.os.Bundle;
  5. public class ServiceDemoActivity extends Activity {
  6.  /** Called when the activity is first created. */
  7.  @Override
  8.  public void onCreate(Bundle savedInstanceState) {
  9.  super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);

  11. 实验一:startService(new Intent(this,MyService.class));
  12. 结果分析:主界面阻塞,最终会出现Application not responding(ANR)

  13.  
  14. 实验二: startService(new Intent(this,MyIntentService.class));
  15.                 startService(new Intent(this,MyIntentService.class));
  16. 结果分析:连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)
  17. }
  18. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值