10天學通Android開發(2-3)-核心組件Service綁定

經過startService開啓的服務,當訪問者關閉時,服務仍然存在;訪問者須要與服務進行通訊,則咱們須要將訪問者與服務進行綁定; html

若是使用Context.bindService()方法啓動服務,則在服務未建立時,系統會調用服務的onCreate()方法,接着調用onBind()方法,這時就訪問者與服務已經綁定了,主程序銷燬時服務也會終止。html5

1)綁定服務時,會自動建立服務。java

2)若是建立後並啓動後再綁定,不會從新建立,一個Service只有一個實例android

3)同時啓動和綁定服務時,解除綁定服務,但不會銷燬關閉服務的,必須解除綁定並中止服務。編程

4)經過StartService啓動服務,當前Activity銷燬,服務不會中止,經過BindService啓動服務,當前Activity銷燬,服務中止。ide

 

綁定與解綁定服務this

(1)Context.bindService(Intent service,ServiceConnectionconn,BIND_AUTO_CREATE);//綁定服務spa

(2)Context.unbindService(ServiceConnectionconn);.net

 

 

ServiceConnectionorm

ServiceConnection爲一個接口,用於綁定和解綁定IBinder,所以須要建立一個類實現它;

class XxxServiceConnectionimplements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {

//service爲在onBind返回的IBinder
//
綁定Binder對象
}
@Override
public void onServiceDisconnected(ComponentName name) {
//
解綁定Binder對象
}
}

 

Service

class XxxService extendsService{

private IBinder binder = new

XxxBinder();

public IBinder onBind(Intent intent){

return binder;

}

public int fun(int a){

//服務提供的方法,可是不能直接調用

...

}

private class XxxBinderextends Binder implements IXxxBinder{

//面向接口編程

public return fun1(int a){

//對外暴露的API

return fun(a);

//內部調用Service的方法

}

}

}

 

案例:綁定服務

主要功能:Service實現不斷輸出123……的服務功能,Activity調用Service的公開方法,調出當時的一個值。繼續上次服務的案例,增長綁定等功能。

  1. 打開activity_main.xml,添加兩個命令按鈕,綁定服務和解除綁定:

<Button

       android:id="@+id/btnBindService"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="綁定服務" />

 

   <Button

       android:id="@+id/btnUnbindService"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="解除綁定" />

2) MainActivity.java,添加相應代碼:

定義兩按鈕:

 private Button btnBindService,btnUnbindService;

 

經過查找獲得這兩個按鈕:

btnBindService=(Button)findViewById(R.id.btnBindService);        btnUnbindService=(Button)findViewById(R.id.btnUnbindService);

3)添加事件偵聽器:

btnBindService.setOnClickListener(this);

btnUnbindService.setOnClickListener(this);

4)在onClick中添加判斷分支:

case R.id.btnBindService:           bindService(serviceIntent,this,Context.BIND_AUTO_CREATE);

        break;

         case R.id.btnUnbindService:

            unbindService(this);

       break;

須要當前類實現ServiceConnection,加進繼承ServiceConnection

publicclass MainActivity extends ActionBarActivity implementsOnClickListener, ServiceConnection {

同時產生了兩接口方法,

成功綁定的方法:

@Override

   publicvoid onServiceConnected(ComponentName arg0, IBinder bind) {

      // TODO Auto-generCatedmethod stub

      System.out.println("onServiceConnected");

       

   }

 

解除綁定或Service崩潰時

   @Override

   publicvoid onServiceDisconnected(ComponentName name) {

      // TODO Auto-generatedmethod stub

      System.out.println("onServiceDisconnected");

   }

5onBind要指定返回值,不然綁定時,其實沒有真正綁定onServiceConnected不會執行

定義內部類MyServiceBinder擴展自Binder

publicclass MyServiceBinder extends Binder{

      public MyServicegetService()

      {

          return MyService.this;//取得服務的實例

      }

   }

定義myservicebinder,並返回:

private final MyServiceBindermyservicebinder=new MyServiceBinder();

public IBinder onBind(Intent arg0) {

      // TODO Auto-generatedmethod stub

      System.out.println("onBind");     

     

      returnmyservicebinder;

   }

6)服務內添加一輸出:

privateinti=0;

  

   publicvoid startTimer(){

      if(timer==null){

          timer=new Timer();

          task=new TimerTask(){

             @Override

             publicvoid run(){

                i++;

                System.out.println(i);

               

          }

      };

      timer.schedule(task,1000,1000);

      }

   }

  

publicvoid stopTimer(){

      if(timer!=null)

      {

          task.cancel();

          timer.cancel();

          task=null;

          timer=null;

      }

   } 

  

   private Timer timer=null;

   private TimerTask task=null;

  

 其中,每一秒鐘執行:

timer.schedule(task,1000,1000);

7onCreateonDestroy添加startTimerstopTimer

publicvoid onCreate(){

      System.out.println("建立好了");

     

      startTimer();

      super.onCreate();

   }

  

   @Override

   publicvoid onDestroy(){

      System.out.println("被銷燬了");

      stopTimer();

      super.onDestroy();

   }

8)取得服務實例:

publicclass MyServiceBinder extends Binder{

      public MyService getService()

      {

          return MyService.this;//取得服務的實例

      }

   }

9)公開一個方法,取得服務內部的數字(狀態)

publicint getCurrentNum()

   {

      returni;

   }

10)回到主Activity,取得服務

定義變量:

private MyService myService=null;

取得實例:

publicvoid onServiceConnected(ComponentNamearg0, IBinder bind) {

      // TODO Auto-generCatedmethod stub

      System.out.println("onServiceConnected");

      myService=((MyService.MyServiceBinder) bind).getService();

     

   }

11)添加按鈕

<Button

       android:id="@+id/btnGetCurrentNumber"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

        android:text="GetCurrentNum" />

定義按鈕:

private Button btnGetCurrentNumber;

取得:

btnGetCurrentNumber=(Button)findViewById(R.id.btnGetCurrentNumber);

事件:

       btnGetCurrentNumber.setOnClickListener(this);

實現:

case R.id.btnGetCurrentNumber:

            if(myService!=null)

            {

               System.out.println("當前服務中的數字是"+myService.getCurrentNum());

            }

        break;


文獻參考:

http://blog.csdn.net/xiazdong/article/details/7772914

http://www.cnblogs.com/andriod-html5/archive/2012/02/28/2539457.html

http://blog.163.com/cazwxy_12/blog/static/898763720122106483898/

相關文章
相關標籤/搜索