Activity通过bindService启动Service后Activity和Service之间的通信!

本文介绍了一个Android应用程序中Service与Activity间通过绑定进行通信的例子。详细展示了如何创建一个Service,并通过Binder机制实现Activity与Service的数据交互。

最近在看同一个程序中Service的两种驱动方式时,起以Bind启动然后可以进行ServiceActivity之间的相互通信。一直没看明白,在翻看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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值