Service可以和Activity绑定,后者会维持对Service实例的引用,此引用允许你像对待其他实例化的那样,对正在运行的Service进行方法调用。
允许Service和Activity绑定,这样能够获得更加详细的接口。要让一个Service支持绑定,需要实现onBind方法,并返回被绑定Service的当前实例。
package com.example.androidtest.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service { private final IBinder binder = new MyBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return binder; } public class MyBinder extends Binder{ MyService getService(){ return MyService.this; } } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } }
Service和其他组件之间的连接表示为一个ServiceConnection.
要想将一个Service和其他组件进行绑定,需要实现一个新的ServiceConnection,建立一个连接之后,就可以通过重写onServiceConnected和onServiceDisconnectd方法来获得对service的引用。程序:
package com.example.androidtest; import com.example.androidtest.service.MyService; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.view.Menu; public class MainActivity extends Activity { private MyService myService; //service和activity之间的连接 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub myService = null; } @Override public void onServiceConnected(ComponentName className, IBinder service) { //当建立连接时调用 myService = ((MyService.MyBinder)service).getService(); } }; public void toBind(){ //绑定一个service Intent bindIntent = new Intent(MainActivity.this,MyService.class); bindService(bindIntent, mConnection, BIND_AUTO_CREATE); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }