Service-Handler-Binder-Messenger-AIDL

这个系列博客 是讲解Service相关的知识

1,什么是service?

Service是一个可以在后台执行长时间操作而不使用用户界面的应用组件。它一般运行在主线程中.如果需要在service里面做一些耗时的任务,一般开启子线程来完成.

Service继承ContextWapper-->Context        

 

2.Service 以及其子类IntentService的区别.         

Service 默认运行在ui线程中(可以处理比较复杂的问题.多线程请求问题).        
IntentService 有一下特点:
  • 默认的工作线程,用于在应用的主线程外 执行传递给 onStartCommand()  的所有 Intent    

  • 创建工作队列,用于将一个 Intent 逐一传递给 onHandleIntent() 实现        

  • 在处理完所有启动请求后停止服务 不用自己调用stopSelf()                        
public class IntentServiceDemo extends IntentService {
    public IntentServiceDemo(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //在这里根据intent进行操作

    }
}


如果你有让service同时处理多个请求的需求,这个时候就只能去继承Service了。这个时候就要自己去处理工作线程那些事.    

public class HelloService extends Service {
  private Looper mServiceLooper;
  private ServiceHandler mServiceHandler;

  private final class ServiceHandler extends Handler {
      public ServiceHandler(Looper looper) {
          super(looper);
      }
      @Override
      public void handleMessage(Message msg) {
          long endTime = System.currentTimeMillis() + 5*1000;
          while (System.currentTimeMillis() < endTime) {
              synchronized (this) {
                  try {
                      wait(endTime - System.currentTimeMillis());
                  } catch (Exception e) {
                  }
              }
          }
          stopSelf(msg.arg1);
      }
  }

  @Override
  public void onCreate() {
    HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

      Message msg = mServiceHandler.obtainMessage();
      msg.arg1 = startId;
      mServiceHandler.sendMessage(msg);

      return START_STICKY;
  }

  @Override
  public IBinder onBind(Intent intent) {
      return null;
  }

  @Override
  public void onDestroy() {
    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
  }
}


Service的创建,直接继承Service 复写里面的方法.    

  • onCreate() 

  • 在service的生命周期中这个方法仅会调用一次,调用在onStartCommand()以及onBind()之前,可以在这个方法中进行一些一次性的初始化工作。        

  • onStartCommend()    在其他组件调用startService()的时候调用.    

  • onBind(). 其他组件通过bindService(,,,)来绑定时候调用.该方法要求返回一个IBinder对象.它是用来其他组件和Service进行通讯的桥梁.    

  • onDestory(). 如果是通过bind 绑定的service,在销毁前,要先调用unbindService()方法.

Service启动方式
启动service的方式 停止service的方式

service与启动它的组件之间的通信方式    

 (广播组件不能直接和Service通讯)

service的生命周期  
startServie service中调用stopSelf()方法,或者其他组件调用stopService()方法 没有提供默认的通信方式,启动service后该service就处于独立运行状态 一旦启动,service即可在后台无限期运行,即使启动service的组件已被销毁也不受其影响,直到其被停止  
bindService 调用unbindService()方法 可以通过 ServiceConnection进行通信,组件可以与service进行交互、发送请求、获取结果.还可以利用IPC跨进程执行这些操作 当所有与其绑定的组件都取消绑定(可能是组件被销毁也有可能是其调用了unbindService()方法)后,service将停止  








































你可能感兴趣的:(service,相关知识点)