android java開發 第三天 之 Activity 與 Service 綁定(activiey 調用service中方法)

一個常見的應用場景:

        loginactivity登陸頁面 點擊login, 發送給後臺的服務類CmdSocketService 去處理登陸業務,

並獲取登陸狀態(成功失敗的反饋)

loginActivity使用封裝好的CmdSocketService(service)類的方法:

 

a) loginActivity類中定義:

 

CmdSocketService serviceBinder;

 

// 下面定義用來連接到服務CmdSocketService後的處理函數
 private ServiceConnection mConn = newServiceConnection()

{
      public void onServiceConnected(ComponentName className, IBinder service)

     {

                   // 這裡service其實是MyBinder類對象,,其中有個getService()方法,用於返回service對象自己。

                   // LoginActivity獲得瞭service對象(serviceBinder)的引用,那使用service中方法和普通的類方法一樣使用。
              serviceBinder=((CmdSocketService.MyBinder)service).getService();

              Log.v(TAG,"get CmdSocketService 引用 ok !");

              mBound = true;//自己定義的服務是否綁定標記
      }
      public void onServiceDisconnected(ComponentName className) {
              serviceBinder = null;

              mBound = false;
      } 
};

 

 b) onStart()中定義:

Intent intent = new Intent(this,CmdSocketService.class)

 

bindService(intent, mConn, Context.BIND_AUTO_CREATE);

 

//===========================================================

service類中的定義:

public class CmdSocketService extends Service{

//1 .

public class MyBinder extends Binder

{
      public CmdSocketService getService()

     {

      Log.v(TAG,"getService()");

      return CmdSocketService.this;  //返回service對象本身
      } 
}

 

// 2.
private MyBinder mBinder = new MyBinder();

 

//3.反饋給onServiceConnection()

onBind()中實現:

{

       return mBinder;

}

 

activity和services綁定流程:(bindService方式)

1. new intent指定和哪個service綁定

2. 開始綁定,傳遞服務連接處理函數ServiceConnection()(有點像回調函數),//調用此函數時android會調用service類中的onBind()函數。

3.onBind()函數裡面返回瞭一個Binder子類對象。Binder子類中有個getServices()方法,返回service對象本身。,最終就是為瞭給loginActiviy返回service對象的引用。

4.logingActivity和service綁定成功後。android會調用onServiceConnected()函數。此函數中IBinder就是service返回的Binder的子類對象MyBinder.

5.調用MyBinder中的方法getService()即可獲得service對象的引用。

6.開始調用service中的公共方法吧。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *