当前位置: 首页 > news >正文

广州广告网站建设新闻最近的大事10件

广州广告网站建设,新闻最近的大事10件,17网一起做网店网站,电商网站后台管理系统模板aidl提供了binder调用的封装,有的时候,比如: 1. 懒得使用aidl生成的接口文件(确实是懒,Android studio中aidl生成接口文件很方便) 2. 服务端的提供者只公开了部分接口出来,只给了调用编号和参…

aidl提供了binder调用的封装,有的时候,比如:

1. 懒得使用aidl生成的接口文件(确实是懒,Android studio中aidl生成接口文件很方便)

2. 服务端的提供者只公开了部分接口出来,只给了调用编号和参数(这个设计就很奇怪,其实可以提供fake的aidl文件,暴露部分方法即可)

3. 想看看更直观的binder通信的调用

可以使用transcat调用,以下是直观的一个例子

		try {
//获取服务,可以使用反射来实现IBinder aProxyBinder = (IBinder)getSystemService("lam");//atestif (aProxyBinder != null){Log.d(TAG, "lam not null");}	    		else {Log.d(TAG, "lam is null");}Parcel dataParcel = Parcel.obtain(); Parcel resultParcel = Parcel.obtain();dataParcel.writeInterfaceToken(DESCRIPTOR);//发起请求	 aProxyBinder.transact(3, dataParcel, resultParcel, 0);

在 Android 中,直接使用 Binder 的 transact 方法来调用 Binder 接口是一种底层的方法,通常用于自定义的 IPC(进程间通信)场景。这种方式绕过了 AIDL 自动生成的代码,允许你手动进行跨进程调用。下面将介绍如何直接使用 transact 方法来调用 Binder 接口。

1. 理解 transact 方法

transact 方法是 IBinder 类中的一个关键方法,它用于执行跨进程请求。其原型如下:

public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException;
  • code: 请求码,标识要调用的具体方法。
  • data: 输入参数,封装在 Parcel 对象中。
  • reply: 输出结果,同样封装在 Parcel 对象中。
  • flags: 标志位,控制事务的行为(如 FLAG_ONEWAY 表示异步调用)。

2. 定义和实现 Binder 接口

首先,你需要定义一个接口,并提供相应的服务端实现。这个过程可以通过 AIDL 来完成,但为了演示如何直接使用 transact,我们将不使用 AIDL 自动生成的 stub 类。

假设我们有一个简单的服务接口 IMyService,它包含一个名为 doSomething 的方法,该方法接受一个字符串作为输入,并返回一个字符串作为输出。

2.1 服务端实现
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;public class MyService extends Binder {private static final int TRANSACTION_DO_SOMETHING = IBinder.FIRST_CALL_TRANSACTION + 0;@Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {if (code == TRANSACTION_DO_SOMETHING) {data.enforceInterface("com.example.IMyService");String input = data.readString();String output = doSomething(input);reply.writeInterfaceToken("com.example.IMyService");reply.writeString(output);return true;}return super.onTransact(code, data, reply, flags);}public String doSomething(String input) {// 实现你的业务逻辑return "Hello, " + input;}
}

在这个例子中,我们重写了 onTransact 方法,并根据传入的 code 来处理不同的请求。对于 TRANSACTION_DO_SOMETHING 请求,我们从 Parcel 中读取输入数据,调用 doSomething 方法处理数据,然后将结果写回到 reply 中。

2.2 客户端调用

接下来,我们需要编写客户端代码来使用 transact 方法调用 doSomething 方法。

import android.os.Binder;
import android.os.Parcel;
import android.os.RemoteException;public class MyClient {private IBinder binder;public MyClient(IBinder binder) {this.binder = binder;}public String callDoSomething(String input) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();try {data.writeInterfaceToken("com.example.IMyService");data.writeString(input);// 调用 transact 方法boolean result = binder.transact(MyService.TRANSACTION_DO_SOMETHING, data, reply, 0);if (result) {// 读取回复数据reply.readException(); // 检查是否有异常抛出return reply.readString();} else {throw new RemoteException("Transaction failed.");}} finally {data.recycle();reply.recycle();}}
}

在这个例子中,我们创建了两个 Parcel 对象:datareply。我们使用 writeInterfaceToken 方法为 data 写入接口令牌,然后写入方法参数。接着,我们调用 transact 方法发送请求,并通过 reply 读取响应数据。最后,不要忘记回收 Parcel 对象以释放资源。

3. 注意事项

  • 错误处理:在调用 transact 方法时,务必检查返回值并处理可能的异常。例如,可以使用 reply.readException() 来检查服务器是否抛出了异常。

http://www.hengruixuexiao.com/news/11799.html

相关文章:

  • 西部数码虚拟主机怎么做网站建立一个企业网站需要多少钱
  • 广告设计师工作内容成都seo工程师
  • 厦门谷歌推广seo网络推广怎么做
  • 前端页面设计百度seo培训
  • 公司网站域名更改怎么做百度一下官方网页版
  • 一般网站建设费用预算百度竞价推广开户价格
  • 专业做网站和小程序友情链接有什么用
  • 网站被墙检测独立站seo优化
  • wordpress后台禁止更新济南网站seo哪家公司好
  • 高密网站制作成都高端网站建设哪家好
  • 房屋租赁网站开发背景竞价开户公司
  • wordpress rds外贸网站优化推广
  • 什么更新wordpressseo需要培训才能找到工作吗
  • 做网站时怎么插入视频企业文化设计
  • 国家网站备案二次感染即将大爆发
  • 如何做淘宝客个人网站千锋教育课程
  • 电脑网站建设安卓嗅探app视频真实地址
  • 怎么做类似淘宝网站吗菏泽资深seo报价
  • 电子商务网站软件建设的核心是超链接友情外链查询
  • 网站建设的作用有哪些方面网站推广优化怎样
  • 做旅游广告在哪个网站做效果好18款禁用网站app直播
  • 可以做英语阅读理解的网站电话投放小网站
  • dede模板用图片多的网站不行营销网络是啥意思
  • 英国零售电商网站开发做电商必备的几个软件
  • 网站建设需求怎么提百度竞价客服电话
  • 网站开发页面静态化技术网站优化外包
  • 昆明做网站优化个人网站推广怎么做
  • 对亚马逊网站做简要分析与评价seo短视频发布页
  • 兰州高端网站建设广州竞价托管代运营
  • seo点击排名软件营销工具东莞seo培训