2016-06-09 124 views
0

我在Parcel参与Android源代码中的方法调用后查看&存在问题。我该如何检查使用Parcel.transact调用的方法

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

我特别相信的在发送以下行()IIntentSender的方法是很重要的:

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

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

感谢您的帮助提前!

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

+0

您需要在具体问题中找到绑定事务另一端的任何代码 - 只是实现事务本身(最终是本地的,即C++)的代码不会很有趣,因为它是只是组件之间的通道。 –

回答

0

粘合剂是只是一个进程间函数调用的“胆”。 Providers,Intents和Messages实际上只是Binder协议的抽象。关于Binder协议有很多信息,但它的设计使大多数人不必担心它。

当您调用诸如getActivity()之类的函数时,您正在获取一个将在稍后使用的意图对象,但是到那时,它将使用活页夹来完成其工作。

这就是我们所说的,你对“胆量”的评价太过分了,需要退后一步。 Binder在各个地方都可以使用,只是一种通用的通信方式。不管.transact调用的另一端是什么,都取决于Binder(或者在这种情况下,PendingIntent)被获取的方式。

尝试推导出哪些组件可以处理您的特定品种的意图,并在其代码中查找.transact方法。这通常采用巨大的开关语句的形式,根据.transact的第一个参数调用不同的函数。无论是什么情况下,阻断电话将成为您“有趣”的事情。

在你的情况TRANSACTION_send让我想到找到一些活动的能力,“发送”的东西。好吧,这听起来像是ActivityManager的工作。该代码可以发现here。请查看onTransact方法以了解一些潜在的断点位置。

+0

非常感谢。我确实在Activitymanager类中找到了我正在寻找的东西。如果我有足够的声望,我会赞成你的回答 –

相关问题