AndroidService 深度解析(2)

AndroidService 深度解析(2)

上一篇文章我们对Service的生命周期进行了测试及总结。这篇文章我们介绍下绑定运行的Service的实现。

绑定运行的Service可能是仅为本应用提供服务,称为本地Service;也可能为其他应用提供跨进程服务,即远程Service。下面分别进行介绍:

本地Service

如果Service只服务于本应用,那么我们只需要继承Binder类,定义我们需要实现的方法即可,当发起绑定连接时,Service将会在onBind方法中返回这个继承类的对象,使得客户端与Service共享一个Binder对象。Binder就像一座桥梁,使客户端与Service能够互相联系。下面贴出本地Service的实现示例:

LocalService代码:

public classLocalService extends Service {private String TAG =getClass().getSimpleName();MyBinder myBinder = new MyBinder();ServiceListener myServiceListener;public LocalService() {}public interface ServiceListener {public String getActivityInfo();}private void setListener(ServiceListenermyServiceListener) {this.myServiceListener = myServiceListener;}//绑定成功后,Service就可以通过这个方法获得Activity的信息private void getActivityInfo() {String activityInfo =myServiceListener.getActivityInfo();Log.d(TAG, TAG +"+activityInfo——>" + activityInfo);}private String getInfo() {return "Hello,我是LocalService的方法,你可以通过它的对象访问我!";}public class MyBinder extends Binder {public String getServiceInfo() {return getInfo();}public void setServiceListener(ServiceListenermyServiceListener) {setListener(myServiceListener);}}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, TAG +"——>onBind()");return myBinder;}@Overridepublic void onRebind(Intent intent) {Log.d(TAG, TAG +"——>onRebind()");super.onRebind(intent);}@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, TAG +"——>onUnbind()");//return false;这里的返回值决定下一次绑定时是否执行onRebindreturn true;}}

LocalActivity代码:

public classLocalActivity extends ActionBarActivity {private String TAG =getClass().getSimpleName();Intent serviceIntent;@Overrideprotected void onCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_local);Log.d(TAG, TAG +"——>onCreate()");serviceIntent = new Intent(this,LocalService.class);}public void bindService(View v) {Log.d(TAG, TAG +"——>bindService()");bindService(serviceIntent,serviceConnection, Service.BIND_AUTO_CREATE);}public void unBindService(View v) {Log.d(TAG, TAG +"——>unBindService()");unbindService(serviceConnection);}@Overrideprotected void onDestroy() {Log.d(TAG, TAG +"——>onDestroy()");super.onDestroy();}ServiceConnection serviceConnection = newServiceConnection() {@Overridepublic voidonServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, TAG +"——>onServiceConnected()");LocalService.MyBinder binder =(LocalService.MyBinder) service;String localServiceInfo =binder.getServiceInfo();Log.d(TAG, TAG +"+onServiceConnected——>" + localServiceInfo);binder.setServiceListener(newLocalService.ServiceListener() {@Overridepublic String getActivityInfo(){return "Hello,我在LocalActivity中,LocalService可以调用我获得LocalActivity的消息!";}});}@Overridepublic voidonServiceDisconnected(ComponentName name) {Log.d(TAG, TAG +"——>onServiceDisconnected()");}};}

Activity对应的布局就是两个按钮,分别实现绑定和解绑功能,如图:

Activity与Service都是需要在Manifest文件中注册的哦。

我们启动Activity,先后绑定Service,输出日志如下:

03-17 10:10:58.525 D/LocalActivity﹕LocalActivity——>onCreate()03-17 10:11:00.955 D/LocalActivity﹕LocalActivity——>bindService()03-17 10:11:00.975 D/LocalService﹕LocalService——>onBind()03-17 10:11:00.995 D/LocalActivity﹕LocalActivity——>onServiceConnected()03-17 10:11:00.995 D/LocalActivity﹕ LocalActivity+onServiceConnected——>Hello,我是LocalService的方法,你可以通过它的对象访问我!03-17 10:11:16.345 D/LocalActivity﹕LocalActivity——>unBindService()03-17 10:11:16.345 D/LocalService﹕LocalService——>onUnbind()

上面的日志显示,我们的确实现了Service的绑定与解绑工作,不仅如此,细心的你应该还发现了我们实现了Service与Activity中相互的调用吧。是的,在实际工作中我们不仅需要指示Service为我们提供服务,Service有时也需要获取到客户端的数据来更好地提供服务(LocalService中的getActivityInfo方法 通过回调实现)。

这里我总结下具体的实现过程:

本例中的getServiceInfo方法实现了获取Service信息的功能,当然有时候为了简便,我们直接提供方法返回Service对象,但是一般并不建议这样做;同时注意到setServiceListener方法,它是实现Service调用Activity提供方法的重要环节,我们通过回调的方法实现了Service对Activity的访问;

一起吃早餐,午餐,晚餐。或许吃得不好,

AndroidService 深度解析(2)

相关文章:

你感兴趣的文章:

标签云: