adnroid四大组件之Service 绑定服务,数据通信-IBinder
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了adnroid四大组件之Service 绑定服务,数据通信-IBinder相关的知识,希望对你有一定的参考价值。
绑定服务:
第一步:创建一个服务类,实现onBind() 方法, 返回一个IBinder对象,
这个对象定义了与服务通信的接口,客户端接收到这个IBinder,与服务进行
通信。 IBinder的实现类通过一个 方法用来获取服务,和onTransact方法
与客户端进行通信。
第二步:在清单文件注册服务<service>
<service android:name="com.example.bindservicedemo.BindService"></service>
第三步: 客户端通过ServiceConnection来获取服务,和IBinder,
通过IBinder来进行通行。
public class BindService extends Service {
public void onCreate() {
Log.i("tag", "onCreate()");
};
@Override//返回一个IBinder对象,供客户端接收,与服务进行通信
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
String title = intent.getStringExtra("title");
Log.i("tag", "onBind()》》》》"+title);
return new MyBinder();
}
@Override//解除绑定
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.i("tag", "onUnbinds()");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {//销毁服务
// TODO Auto-generated method stub
Log.i("tag", "onDestroy()");
super.onDestroy();
}
/**
* 提供一个外部访问的方法
* @return
*/
public int getRandom() {
Random random = new Random();
return random.nextInt(100);
}
/**
* 定义一个Binder的实现类,进行通信的接口,
* 功能:
* 获取服务 getService()
* 数据通信 onTransact()
*/
public class MyBinder extends Binder{
/**
* 提供获取服务的方法
*/
public BindService getService() {
return BindService.this;
}
@Override//数据通信
protected boolean onTransact(int code, Parcel data, Parcel reply,
int flags) throws RemoteException {
/**
* 接收客户端的数据
*/
int age = data.readInt();
String name = data.readString();
Log.i("tag", "接收到客户的数据:"+name+"已经"+age+"岁");
/**
* 回复数据
*/
reply.writeInt(1324);
reply.writeString("raise");
return super.onTransact(code, data, reply, flags);
}
};
}
客户端:
Binder是一个远程传输的对象,是轻量级的远程传输机制的核心。
用户简单地数据通信
public class MainActivity extends Activity { private MyBinder myBinder ; private BindService bindService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 绑定服务的事件监听 */ public void doBindService(View v){ Intent intent = new Intent(MainActivity.this, BindService.class); intent.putExtra("title", "土豆、土豆,我是地瓜"); //绑定服务 bindService(intent, conn, BIND_AUTO_CREATE); } public void doUnBindService(View v) { ///解除绑定服务 unbindService(conn); } /** * 调用service中定义的方法 * @param v */ public void getServiceMethod(View v) { if(bindService != null){ bindService.getRandom(); } } /** * 数据通信事件通信 */ public void onProgressConn(View v) { //传数据 Parcel 是一个序列化对象, Parcel out = Parcel.obtain(); out.writeInt(23); out.writeString("jack"); //接收数据 Parcel in = Parcel.obtain(); try { myBinder.transact(IBinder.LAST_CALL_TRANSACTION, out, in, 0); } catch (RemoteException e) { e.printStackTrace(); } int age = in.readInt(); String name = in.readString(); Log.i("tag", "接收到服务的数据:"+name+"已经"+age+"岁了"); } /** * 通过ServiceConnection获取服务和通信接口MyBnder */ public ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.i("tag", "onServiceConnected"); myBinder = (MyBinder)service; bindService = myBinder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.i("tag", "onServiceDisconnected"); } }; }
以上是关于adnroid四大组件之Service 绑定服务,数据通信-IBinder的主要内容,如果未能解决你的问题,请参考以下文章