如何检查使用Parcel.transact调用的方法

时间:2016-06-09 21:36:23

标签: android android-source parcel

我有关于观看和放映的问题当Parcels参与时,在android源代码中调用以下方法。

我想通过查看Android源代码来了解更多关于PendingIntents的内部工作原理,但是当事情变得有趣时,Parcel会弹出一些模糊的函数被调用,重要的一点就结束了。

我特别相信IIntentSender的send()方法中的以下几行非常重要:

mRemote.transact(Stub.TRANSACTION_send, _data, _reply, 0);

这是我迷路的地方。如何找到下一个调用的方法?试图查看transact方法的来源只是揭示了一个没有代码的接口! mRemote的类型是android.os.IBinder(再次是一个接口)

提前感谢您的帮助!

(P.S:我使用grepcode.com检查源代码)

1 个答案:

答案 0 :(得分:0)

Binder只是进程间函数调用的“内脏”。提供者,意图和消息实际上只是Binder协议的抽象。关于Binder协议有很多信息,但它的设计使大多数人不必担心它。

当您调用const _id = MyCollection._makeNewID(); const doc = { _id, values: [ { _id, ... }, { ... } ] }; MyCollection.insert(doc); 等函数时,您正在获取稍后将使用的intent对象,但是当该时间到来时,它会使用binder来完成其工作。

这就是说,你已经走得太远了“胆量”,需要退后一步。 Binder实际上在任何地方使用,只是一种通用的通信方式。无论getActivity()调用的另一方是什么,取决于获取Binder(或在本例中为PendingIntent)的方式。

尝试推断出哪个组件可以处理特定种类的意图,并在其代码中查找.transact方法。这通常采用巨大的switch语句的形式,根据.transact的第一个参数调用不同的函数。无论案例块调用将是什么“有趣”给你。

在你的情况下.transact让我想到找到一些具有“发送”功能的活动。嗯,这听起来像是TRANSACTION_send的工作。可以找到此代码here。查看一些潜在断点位置的onTransact方法。