最近在看同一个程序中Service的两种驱动方式时,起以Bind启动然后可以进行Service和Activity之间的相互通信。一直没看明白,在翻看SDK时发现一个例子,特别摘抄如下:
这个时BindingService继承自Activity,然后通过点击按钮来启动Service
publicclassBindingServiceextendsActivity{
privatestaticfinalStringTAG="BindingService";
//mService负责接收Service传过来的对象
LocalServicemService;
booleanmBound=false;
ButtonbindBtn;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bindBtn=(Button)findViewById(R.id.bindBtn);
bindBtn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
Log.i(TAG,"OnClick....");
if(mBound){
intnum=mService.getRandomNumber();
Toast.makeText(BindingService.this,num+"",Toast.LENGTH_LONG).show();
}
}
});
}
@Override
protectedvoidonStart(){
super.onStart();
//BindtoLocalService
Intentintent=newIntent(this,LocalService.class);
Log.i(TAG,"onStart.....onBind");
bindService(intent,mConnection,Service.BIND_AUTO_CREATE);
}
@Override
protectedvoidonStop(){
super.onStop();
//UnBindfromtheservice
if(mBound){
unbindService(mConnection);
mBound=false;
}
}
//Definescallbacksforservicebinding,passedtobindService()
privateServiceConnectionmConnection=newServiceConnection(){
@Override
//在Service断开的时候调用这个函数
publicvoidonServiceDisconnected(ComponentNamename){
//另外说明在这里打log或者是使用Toast都不能显示,不知道是怎么回事
mBound=false;
}
@Override
//在Service连接以后调用这个函数
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
//wehaveboundtoLocalService,casttheIBinderandgetLocalServiceinstance
//获得Service中的Binder对象
// 另外说明在这里打log或者是使用Toast都不能显示,不知道是怎么回事
LocalBinderbinder=(LocalBinder)service;
//通过Binder对象获得Service对象,然后初始化mService
mService=binder.getService();
Log.i(TAG,"onServiceConnected.....");
System.out.println("onServiceConnected.....");
mBound=true;
}
};
}
publicclassLocalServiceextendsService{
//Bindergiventoclients
//返回一个Binder对象
privatefinalIBindermBinder=newLocalBinder();
//Randomnumbergenerator
privatefinalRandommGenerator=newRandom();
/***
*ClassusedfortheclientBinder.Becauseweknowthisservicealways
*runsinthesameprocessasitsclients
*/
publicclassLocalBinderextendsBinder{
LocalServicegetService(){
//returnthisinstanceofLocalServicesoclientscancallpublicmethod
returnLocalService.this;
}
}
@Override
//如果是通过startService()函数启动的时候,这个函数是不起作用的。
//publicvoidonServiceConnected(ComponentNamename,IBinderservice)返回的Activity
//IBinderservice对象
publicIBinderonBind(Intentintent){
//IBinder通信关键是利用Activity中的IBider对象获得service对象,然后调用service中的函数
//传给Activity一个Binder对象,通过这个Binder对象调用getService()获得Service对象
returnmBinder;
}
//methodforclients
publicintgetRandomNumber(){
returnmGenerator.nextInt(100);
}
}
本文介绍了一个Android应用程序中Service与Activity间通过绑定进行通信的例子。详细展示了如何创建一个Service,并通过Binder机制实现Activity与Service的数据交互。
969

被折叠的 条评论
为什么被折叠?



