再上一篇博客中,簡單的介紹瞭Service的用法,也就是Service的啟動與關閉。不過,當程序通過startService()和stopService()啟動、關閉Service時,Service與訪問者之間基本上不存在太多的關聯,因此Service與訪問者之間無法進行通信、數據交換。就如同平時我們寄信,當信寄出去後,我們無法得到信是否送達、在送信過程中的狀況等等,當我們想得到這些信息時,也就是當我們想Service與訪問者之間進行方法調用以及數據交換時,就應該用到bindService()和unbindService()方法來啟動、關閉Service。
Context的bindService()方法的完整命名為:bindService(Intent service,ServiceConnection conn,int flags)
service:該參數通過Intent指定要啟動的Service
conn:該參數是一個ServiceConnection對象,該對象用於監聽訪問者與Service之間的連接狀態。當訪問者訪問者與Service之間連接成功時將回調該ServiceConnection對象的onServiceConnected(ComponentName name,Ibinder service)方法;當Service所在的宿主進程由於異常中止或其他原因終止,導致該Service與訪問者之間斷開連接時回調該ServiceConnection對象的onServiceDisconnected(ComponentName name)方法。
flags:指定綁定時是否主動創建Service(如果Service還未創建)。該參數可以是0(不自動創建)或BIND_AUTO_CREATE(自動創建).
——當調用者主動通過unBindService方法斷開與Service的連接時,ServiceConnection對象的onServiceDisconnected(ComponentName name)方法不會被調用。
在ServiceConnection對象的onServiceConnected方法中有一個Ibinder對象,該對象即可實現與被綁定Service之間的通信。
下面的例子示范瞭如何在Activity中綁定本地Service,並獲取Service的運行的狀態,即與Service通信。
BinderService.java:
package com.ye_yun_lin.binderserviceactivity; import android.R.integer; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class BinderService extends Service{ private int count; private boolean quit; private MyBinder myBinder=new MyBinder(); public class MyBinder extends Binder{ public int getcount(){ return count; } } @Override public IBinder onBind(Intent intent) { System.out.println("Service is binded"); return myBinder; } @Override public void onCreate() { super.onCreate(); System.out.println("Service is created"); new Thread(){ @Override public void run() { while (!quit) { try { Thread.sleep(1000); } catch (Exception e) { } count++; } } }.start(); } @Override public void onDestroy() { super.onDestroy(); this.quit=true; System.out.println("Service is Destroyed"); } @Override public boolean onUnbind(Intent intent) { System.out.println("Service is unbinded"); return super.onUnbind(intent); } }
配置Service:
MainActivity.java:
package com.ye_yun_lin.binderserviceactivity; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button bindButton,unbindButton,buttonStatusButton; BinderService.MyBinder binder; private ServiceConnection conn=new ServiceConnection() { //當該Activity與Service斷開連接時回調該方法 @Override public void onServiceDisconnected(ComponentName name) { System.out.println("--Service Didconnected--"); } //當該Activity與Service連接成功時回調該方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("--Service Connected--"); binder=(BinderService.MyBinder) service; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindButton=(Button)findViewById(R.id.bindservice); unbindButton=(Button)findViewById(R.id.unbindservice); buttonStatusButton=(Button)findViewById(R.id.servicestatus); final Intent intent=new Intent(); intent.setAction("com.ye_yun_lin.binderserviceactivity.BinderService.local"); bindButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { bindService(intent, conn, Service.BIND_AUTO_CREATE); } }); unbindButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { unbindService(conn); } }); buttonStatusButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Service的count值為:"+binder.getcount(), Toast.LENGTH_SHORT).show(); } }); } }
結果:
通過上面兩個例子,我們可以得到Service的生命周期: