我在C/C++中寻找简单的绑定器IPC示例.最近我开始阅读关于Android Binder基本版(http://bharathi.posterous.com/android-binder)并且通过Android源码中的代码也开始阅读.大部分的binder使用部分都是用C++编写的.有人可以解释为什么使用C++而不是C?
我正在编写一个插件,该插件定义了远程服务并为第三方开发人员提供了AIDL接口。
如何使用此远程服务处理不同客户的并发请求?
正是服务apk的活动可以保持每个客户端的状态,当它们彼此切换时,该怎么做?
我有一个问题与大约一年前@mnish提出的这个问题有关.
请看看他的问题和代码.他实现了一个ServiceConnection()并将其传递给bindService().这遵循顶部附近的服务文档中的本地服务示例.
我想实现本地服务示例,所以我试图从@mnish问题/答案中添加一些细节.在ServiceConnection()中@mnish有这条线让我感到困惑:
mService = ILocService.Stub.asInterface(iservice);
Run Code Online (Sandbox Code Playgroud)
我理解@mnish编写了这段代码,但有没有人知道ILocService是什么,并且知道如何创建自己的ILocService?这个结构记录在哪里,我需要它吗?IBinder的价值来自何处?
我有一个 Android 服务,它通过 AIDL 导出 RPC 接口。该接口是面向连接的,客户端将连接到它,与其进行事务处理,然后在退出时断开连接。
不幸的是,客户端异常退出,例如被系统杀死,它永远没有机会告诉RPC接口连接已关闭。这导致了问题。
当新客户端附加到接口或从接口分离时,有什么方法可以让服务自动收到通知吗?我找到了onBind()和onUnbind(),但它们不是同一件事;他们告诉我该接口是否正在使用。onUnbind()仅当最后一个客户端分离时才会被调用。
有任何想法吗?(并且服务的设计是由外部需求控制的,无法更改......)
更新:我完全忘记提及我已经看过了linkToDeath(),它几乎完全符合我的要求,但它似乎只是以相反的方式工作——它允许客户端在服务终止时收到通知。当我尝试时,似乎什么也没发生。文档有点不完整;有人确定这是否能按我想要的方式工作吗?如果是这样,如何让它告诉我哪个客户死了?
更新更新:我已经解决了这个问题,但只是通过作弊。我重新定义了它。我的应用程序实际上主要是使用 NDK 用 C 语言编写的,因此该服务的设计很奇怪;因此,我将问题转移到 C 世界中,并创建了一个小型帮助程序进程,该进程使用 Unix 域套接字直接与我的应用程序的本机部分进行对话。它速度快、体积小、几乎防弹——但它仍然是作弊行为。因此,虽然我的问题现在已经解决了,但我仍然想知道实际的答案是什么。
对于我的应用程序,我需要在我的活动和服务之间传递数据,这两个服务都在不同的进程中.我知道Google建议在将意图发送到最低限度(不是完整大小的位图)时保持数据通过.当您通过AIDL与服务通信并希望通过远程方法调用传递数据时,是否会应用类似的策略?
我有一个活页夹服务和一个生活在不同进程中的客户端.使用AIDL,当客户端调用我的远程绑定器服务时,有时我需要将错误(异常)中继回客户端.
但是,根据我的理解,这是不可能的.我尝试从我的活页夹服务中抛出一个"RemoteException",看看会发生什么,我得到了
未捕获的远程异常!(进程之间尚不支持例外.)
在我的logcat中.
由于看起来这是不可能的,通知客户端错误的最佳方法是什么?我以为我可以将我的AIDL转换为使用C风格的界面,我只返回错误代码(成功时为0),但这看起来很难看.
有更好的方法吗?
在Android OS源代码(路径:)中/drivers/staging/android/binder_trace.h,我们有一个名为的文件,binder_trace.h并且也/drivers/staging/android/binder.c binder_trace包含在其中。正如我们在binder_trace.h文件中看到的,活页夹交易记录是通过TP_printk指令进行跟踪的。
现在我的问题是,如何在带有adb shell的手机中看到这些内核日志?此外,/sys/kernel/debug/tracing目录中没有任何与活页夹跟踪相关的文件!
为什么我们getService在这里使用方法?
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个LocalService,它使用一些API公开Binder.我创建了一个Service Listener,就像这样:
if (dataServiceListener == null) {
dataServiceListener = new DataServiceListener();
mainActivity.getApplicationContext().bindService
(new Intent(mainActivity, LocalService.class),
dataServiceListener.svcConn, mainActivity.BIND_AUTO_CREATE);
}
Run Code Online (Sandbox Code Playgroud)
我打电话的方法后Binder在dataServiceListener公开,我得到的回应dataServiceListener onResult()方法.到目前为止,没有任何问题,一切正常.当我关闭等待Service Listener回调的Activity并立即重新打开它时,会出现某种问题.即使我再实例化dataServiceListener中onCreate(),我得到两个回调,而不是一个,老一从破坏活动,而后者(右)一个; 这样结果就会在UI上混淆.有没有办法告诉服务或服务侦听器,当活动结束时,必须避免回调.或者甚至可能破坏ServiceListener对象.
我认为这是Mark L. Murphy(Commonsware)在"繁忙的编码器Android开发指南"中描述的问题:
最大的问题是确保活动在完成后收回监听器.
我怎样才能做到这一点?有没有办法在活动结束时摆脱无用的听众?
谢谢!
我正在使用 Kotlin 构建 Android 应用程序,并决定替换对 findViewById 的调用并使用绑定。一切正常,但具体来说,当我更改 RecyclerView 的适配器时,它会破坏项目布局。
带有 findViewById 的原始代码:
class WeightListAdapter(val weights: List<WeightWithPictures>, val onWeightItemClickListener: OnWeightItemClickListener) : RecyclerView.Adapter<WeightListAdapter.WeightHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeightListAdapter.WeightHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_weight, parent, false)
return WeightHolder(view)
}
override fun onBindViewHolder(holder: WeightListAdapter.WeightHolder, position: Int) {
val weightWithPictures = weights[position]
holder.bind(weightWithPictures)
}
override fun getItemCount() = weights.size
inner class WeightHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
private lateinit var weight: Weight
private val weightValueView: TextView = this.itemView.findViewById(R.id.weightValue)
private val weightDateView: TextView …Run Code Online (Sandbox Code Playgroud) 如何在android包中找到binder对象?我想编组一个有位图的包裹,但我得到了运行时异常,说包裹有绑定对象.
android ×11
android-binder ×11
aidl ×2
java ×1
kotlin ×1
linux-kernel ×1
listener ×1
logging ×1
marshalling ×1
parcel ×1
parcelable ×1
stub ×1
trace ×1