Service

目录

  • 多线程
    • android 线程
    • 异步消息处理机制(message handler)
    • AsyncTask
  • Service方法
  • startService(),stopService()
  • bindService(),unBindService()
  • startService()与bindService()启动service区别
  • IntentService
  • 进程间通信

android 线程

_android_主线程是UI thread,UI线程5秒没有反应程序崩溃,所以耗时操作放在子线程中进行,然后把结果传递给UI线程。

service方法

onCreate()onStartCommand()onDestry()onBind()onUnbind()

startService(),stopService()

public class MyService extends Service {  

   public static final String TAG = "MyService";  

   //创建服务时调用
   @ Override  
   public void onCreate() {  
       super.onCreate();  
       Log.d(TAG, "onCreate");  
   }  

   //服务执行的操作
   @ Override  
   public int onStartCommand(Intent intent, int flags, int startId) {  
       Log.d(TAG, "onStartCommand");  
       return super.onStartCommand(intent, flags, startId);  
   }  

   //销毁服务时调用
   @ Override  
   public void onDestroy() {  
       super.onDestroy();  
       Log.d(TAG, "onDestroy");  
   }  

   //onBind()方法是Service中唯一的一个抽象方法,所以必须要在子类里实现。
   //Service有两种启动方式:一种是startService(),另一种是bindService()。第二种启动方式才会用到onBind()方法。
   //我们这先用第一种方式定义Service,所以暂时忽略onBind()方法。
   @ Override  
   public IBinder onBind(Intent intent) {  
       return null;  
   }
public class MainActivity extends Activity implements OnClickListener {  
   private Button button1_start_service;  
   private Button button2_stop_service; 
   @ Override  
   protected void onCreate(Bundle savedInstanceState) {  
       super.onCreate(savedInstanceState);  
       setContentView(R.layout.activity_main);  
       button1_start_service = (Button)findViewById(R.id.button1_start_service);  
       button2_stop_service = (Button)findViewById(R.id.button2_stop_service);  
       button1_start_service.setOnClickListener(this);  
       button2_stop_service.setOnClickListener(this);  
   }  

   @ Override  
   public void onClick(View v) {  
       switch (v.getId()) {  
       case R.id.button1_start_service:  
           Intent startIntent = new Intent(this, MyService.class);  
           startService(startIntent);  
           break;  
       case R.id.button2_stop_service:  
           Intent stopIntent = new Intent(this, MyService.class);  
           stopService(stopIntent);  
           break;  
       default:  
           break;  
       }  
   }  
}

startService()和stopService()方法都是定义在Context类当中的,所以可以在MainActivity中直接调用这两个方法。

  • 操作一:点击start 执行方法onCreate onStartCommand
  • 操作二:不断点击start 执行方法 onStartCommand onStartCommand
  • 操作三:点击stop 执行方法 onStop

bindService(),unBindService()

public class MyBindService01 extends Service {
  public static final String TAG = "MyBindService01";
  private MyBinder mBinder = new MyBinder();
  @ Override
  public void onCreate() {
      super.onCreate();
      Log.d(TAG, "onCreate");
  }

  @ Override
  public IBinder onBind(Intent intent) {
      return mBinder;  //在这里返回新建的MyBinder类
  }

  @ Override
  public boolean onUnbind(Intent intent) {
      Log.d(TAG, "onUnbind");
      return super.onUnbind(intent);
  }

  @ Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Log.d(TAG, "onStartCommand");
      return super.onStartCommand(intent, flags, startId);
  }

  @ Override
  public void onDestroy() {
      super.onDestroy();
      Log.d(TAG, "onDestroy");
  }

  //MyBinder类,继承Binder:让里面的方法执行下载任务,并获取下载进度
  class MyBinder extends Binder {
      public void startDownload() {
          Log.d("TAG", "startDownload() executed");
          // 执行具体的下载任务  
      }
      public int getProgress(){
          Log.d("TAG", "getProgress() executed");
          return 0;
      }
  }
}

public class MainActivity extends Activity implements OnClickListener {
  private Button button1_bind_service;
  private Button button2_unbind_service;
  private MyBindService01.MyBinder myBinder;

  boolean mBound = false; //一开始,并没有和Service绑定.这个参数是用来显示绑定状态

  //匿名内部类:服务连接对象
  private ServiceConnection connection = new ServiceConnection() {

      //当服务异常终止时会调用。注意,解除绑定服务时不会调用
      @ Override
      public void onServiceDisconnected(ComponentName name) {
          mBound = false; //服务异常终止时,状态为未绑定
          //解决了多次执行unbindService()方法引发的异常问题
      }

      //和服务绑定成功后,服务会回调该方法
      @ Override
      public void onServiceConnected(ComponentName name, IBinder service) {
          myBinder = (MyBindService01.MyBinder) service;
          //在Activity中调用Service里面的方法
          myBinder.startDownload();
          myBinder.getProgress();
          mBound = true; //true说明是绑定状态
      }
  };
  @ Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      button1_bind_service = (Button) findViewById(R.id.button1_bind_service);
      button2_unbind_service = (Button) findViewById(R.id.button2_unbind_service);
      button1_bind_service.setOnClickListener(this);
      button2_unbind_service.setOnClickListener(this);
  }
  @ Override
  public void onClick(View v) {
      switch (v.getId()) {
      case R.id.button1_bind_service:
          Intent bindIntent = new Intent(this, MyService.class);
          bindService(bindIntent, connection, BIND_AUTO_CREATE);
//这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后会自动创建Service(即使之前没有创建
//Service也没有关系),这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。
          break;
      case R.id.button2_unbind_service:
          //如果和Service是绑定的状态,就解除绑定。
          if(mBound){
              unbindService(connection);
              mBound=false;
          }
          break;
      default:
          break;
      }
  }
}

  • 操作一:bindService 执行方法 onCreate() getProgress() startDownload()

  • 操作二:unbindService 执行方法 onUnbind() onDestroy()

posted @ 2017-07-18 20:41  s3abiscuit  阅读(212)  评论(0编辑  收藏  举报