Binder C++/JAVA 实现方式

理解Binder机制的原理:

是一种进程间的通信方式,CS架构,用户空间,内核空间

 

C++:

处理消息的是BnInterface的子类

发送消息:

 status_t  transact(uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0);

处理消息:

status_t onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags)

基础知识:

BpInterface和BpBinder中的p表示的意思就是proxy,表示中间的调用和代理,不会具体实现功能
BnInterface和BBinder中的n表示的意思就是native 是最终实现的地方
BpBinder类由client来继承,当然,如果用不上的话,也可以不用继承
如果一个类想使用android中的智能指针,就必须继承或者间接继承RefBase类,比如client

继承关系

    定义一个接口类IDemo,继承IInterface
    定义一个BpDemoService类,继承BpInterface<IDemo>
    定义一个BnDemoService类,继承BnInterface<IDemo>
    定义一个DemoService类,继承BnDemoService,用来实现具体的函数
 

使用案例:

首先定义一个接口类IDemo,然后定义一个代理类BpDemoService,一个native接口BnDemoService,然后定义一个继承BnDemoService的实现类DemoService,用来实现具体函数。最后创建一个client端。调用顺序,首先获取servicemanager的对象,然后创建一个binder来装载service,调用interface_cast()获取service代理端的对象,最后调用接口。

定义一个接口类IDemo,继承IInterface,里面只有一个函数:
class IDemo :public IInterface
{
    public:
        virtual int getAge();
}

定义一个BpDemoService类,继承BpInterface
enum
{
	CUSTOM_CODE = IBinder::FIRST_CALL_TRANSACTION
};
class BpDemoService: public BnInterface<IDemo>
{
    public:
        BpDemoService(const sp<IBinder>& impl):BpInterface<IDemo> (impl){};
        virtual BOOL getAge()
		{
			Parcel data, reply;
		    data.writeInterfaceToken(IDemo::getInterfaceDescriptor());
		    remote()->transact(CUSTOM_CODE, data, &reply);//发送消息
			return (BOOL)reply.readInt32();
		}
}
定义一个BnDemoService类,继承BnInterface
class BnDemoService: public BnInterface<IDemo>
{
    public:
        virtual status_t onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags= 0 );
};
//接受消息处理
status_t BnDemoService::onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags)
{
	switch(code)
		{
			case CUSTOM_CODE:
				{
					CHECK_INTERFACE(IDemo,data,reply);
					int res = getAge();
					reply->writeInt32((int32_t)res);
					return NO_ERROR;
				}
				break;
			default:
	            break;
	   }
	return BBinder::onTransact(code, data, reply, flags);
}
定义一个Service类,继承BnDemoService

用来具体实现函数,最后记得别忘了调用IMPLEMENT_META_INTERFACE宏来进行注册

class DemoService : public BnDemoService,public BinderService<DemoService>
{
    public:
        int getAge();
}
IMPLEMENT_META_INTERFACE(DemoService, "demo.service");




调用顺序

  • 在client端调用的时候,首先获取ServiceManager
  • 然后创建一个binder用来装载service
  • 使用interface_cast()来获得对应的代理端
  • 通过代理端调用在service中实现的函数
sp < IServiceManager > sm = defaultServiceManager();
sp < IBinder > binder;
binder = sm->getService(String16("demo.service"));
sp<IDemo> m_pDemoService;
m_pDemoService = interface_cast<IDemo> (binder);
m_pDemoService->getAge();

interface_cast()函数

作用是把从getService获取到的Binder强制转换为IInterface的子类,也就是定义了自己的那些接口的类

remote()->transact()函数

位置是在代理类中调用的,用来远程给onTransact函数发送消息和数据的,类似于handler.sendMessage()

onTransact()函数

这个函数的位置是在实现类(实现BnInterface)中的,相当于hander中的handleMessage函数

 

JAVA:

引用:

C++ Binder机制学习_空之境界-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Android Binder Demo。 首先,我们定义一个 AIDL 接口文件 `IDemoService.aidl`,它包含一个方法 `int add(int a, int b)`,用于计算两个整数的和。 ```aidl // IDemoService.aidl interface IDemoService { int add(int a, int b); } ``` 然后,我们实现这个接口,创建一个名为 `DemoService` 的服务类,它继承自 `IDemoService.Stub`,实现 `add()` 方法。 ```java // DemoService.java public class DemoService extends IDemoService.Stub { @Override public int add(int a, int b) throws RemoteException { return a + b; } } ``` 接下来,我们创建一个 `Service` 类 `DemoServiceClass`,并在其中实现 `onBind()` 方法,返回 `DemoService` 对象。 ```java // DemoServiceClass.java public class DemoServiceClass extends Service { private DemoService demoService; @Override public void onCreate() { super.onCreate(); demoService = new DemoService(); } @Nullable @Override public IBinder onBind(Intent intent) { return demoService; } } ``` 最后,在 `AndroidManifest.xml` 中声明服务。 ```xml <!-- AndroidManifest.xml --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.binderdemo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 声明 DemoServiceClass --> <service android:name=".DemoServiceClass" /> <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` 现在,我们可以在 `MainActivity` 中创建一个远程服务连接,调用 `add()` 方法并显示结果。 ```java // MainActivity.java public class MainActivity extends AppCompatActivity { private IDemoService demoService; private boolean connected = false; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { demoService = IDemoService.Stub.asInterface(iBinder); connected = true; } @Override public void onServiceDisconnected(ComponentName componentName) { demoService = null; connected = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, DemoServiceClass.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); Button button = findViewById(R.id.button); final TextView result = findViewById(R.id.result); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (connected) { try { int a = Integer.parseInt(((EditText) findViewById(R.id.input1)).getText().toString()); int b = Integer.parseInt(((EditText) findViewById(R.id.input2)).getText().toString()); int sum = demoService.add(a, b); result.setText(String.valueOf(sum)); } catch (RemoteException e) { e.printStackTrace(); } } else { result.setText("Service not connected"); } } }); } @Override protected void onDestroy() { super.onDestroy(); unbindService(connection); } } ``` 这就是一个简单的 Android Binder Demo。它演示了如何创建一个远程服务,实现 AIDL 接口并将其绑定到 Activity。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值