2016-06-09 82 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類中找到了我正在尋找的東西。如果我有足夠的聲望,我會贊成你的回答 –

相關問題