疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Service和IntentService的区别


 

   

  Service和IntentService的区别

  1. 首先IntentService是继承自Service;

  2. Service不是一个单独的进程,它和应用程序在同一个进程中;

  3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作;

  4. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,

  IntentService会处理完成一个之后在处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。

  因此,如果我们如果要在Service里面处理一个耗时的操作,我们可以用IntentService来代替使用。

  5. 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。

  例子:

  使用Service:

  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;

  }

  }

  使用IntentService:

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

  }

  }

  调用:

  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

  //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)

  startService(new Intent(this,MyIntentService.class));

  startService(new Intent(this,MyIntentService.class));

  }

  }