天天看點

《Android 應用案例開發大全(第二版)》——6.7節擷取第三方程式中可調用的視窗

本節書摘來自異步社群《android 應用案例開發大全(第二版)》一書中的第6章,第6.7節擷取第三方程式中可調用的視窗,作者李甯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

6.7 擷取第三方程式中可調用的視窗

android開發權威指南(第二版)

第x問1 源代碼目錄:src/ch06/invokesinaweibo

現在很多程式中使用的功能并未包含在程式本身,都是通過各種插件方式獲得的其他程式的資源。例如,經常會使用到的“分享”功能就是調用了系統中所有可以處理某類資源的視窗來實作的,如果這樣的視窗多于一個,就會顯示一個選擇清單。

由于apk檔案就是zip壓縮格式檔案,是以讀者可以随便找一個解壓軟體将apk檔案解開。這裡假設apk檔案的檔案名為sina_weibo.apk,解開sina_weibo.apk檔案後,再解壓根目錄會找到一個androidmanifest.xml檔案,不過該檔案是被編譯過的,無法使用文本編輯器檢視其内容。但可以使用一些工具将其反編譯。本節介紹一個簡單的工具axmlprinter2,該工具用java編寫,是一個jar檔案,是以可以在任何支援jdk的作業系統平台上使用。該工具的下載下傳位址如下:

<a href="http://android4me.googlecode.com/files/axmlprinter2.jar">http://android4me.googlecode.com/files/axmlprinter2.jar</a>

讀者也可以在随書CD光牒的tools目錄中找到該工具。

現在将axmlprinter2.jar檔案與androidmanifest.xml檔案放到一個目錄,然後在控制台(終端)進入該目錄,并執行如下的指令,将androidmanifest.xml檔案解壓為androidmanifest.txt。

java -jar ./axmlprinter.jar ./androidmanifest.xml &gt; ./androidmanifest.txt

現在用任何一個文本編輯器打開androidmanifest.txt,除了引用的資源都變成了十六進制的值外,其他的内容都恢複了原樣。

本例會使用sina_weibo.apk的3個功能:顯示微部落客界面、釋出微網誌(顯示空的微網誌釋出視窗)和分享微網誌(将要釋出的文本和圖像傳入微網誌釋出視窗)。在運作本例之前一定要安裝sina_weibo.apk,否則程式會因為沒找到相應的視窗而抛出異常。

首先來看如何顯示微部落客界面。既然顯示的是主界面,那麼一定是單擊程式圖示顯示的視窗,也就是包含android.intent.action.main的視窗,了解了這些後,馬上在androidmanifest.txt檔案中搜尋android.intent.action.main,我們會找到一個splashactivity視窗,這是顯示程式封面的視窗,該視窗關閉後,就會顯示微部落客視窗(帶微網誌清單的視窗),由于在splashactivity類中需要做一些初始化工作,是以不能直接顯示主視窗(maintabactivity)。

現在搜素splashactivity視窗的過濾器,會找到如下一個過濾器。我們會發現這個過濾器很眼熟。在6.6.3小節介紹的系統浏覽器(browser)也使用了類似的過濾器,隻不過scheme不同,而且也沒指定host。

如果讀者仔細閱讀了6.5節的内容,應該很容易知道如何顯示這個過濾器所在的視窗,代碼如下。

現在要找到可以釋出新微網誌的視窗,繼續搜尋androidmanifest.txt檔案的内容(主要搜尋标簽),會找到一個叫com.sina.weibo.intent.action.new_blog的action,對應的視窗類是editactivity。現在用下面的代碼測試一下,發現完全可以顯示微網誌的釋出界面。

最後要實作“分享”功能,這個功能需要使用前面涉及的一個通用的action,就是intent.action_send(android.intent.action.send),分享微網誌的代碼如下:

如果讀者還想确定一下的話,可以在androidmanifest.txt檔案中搜尋android.intent.action.send,會找到兩個指定該action的過濾器。一個設定了mime type為“text/plain”,用于處理文本資料;另一個mime type為“image/*”,用于處理文本和圖像資料。如果想同時處理文本和圖像資料(釋出帶圖像的微網誌),可以使用下面的代碼。

如果使用上面的代碼可能會有多個視窗符合條件,這樣就會顯示選擇清單。如果不想顯示選擇清單,直接調用新浪微網誌的分享微網誌界面,可以使用下面的代碼。

注意

使用顯式方式調用editactivity,也需要指定android.intent.action.send,這是因為在微網誌程式内部檢測了action,如果不為intent對象指定action,則action為null,系統就不會繼續處理傳遞的資料了。如果想通過顯式方式分享文本和圖像,對intent對象的設定與隐式方式完全一樣。

如果讀者想調用系統内置的程式,并且沒有android源代碼,也可以從android模拟器上使用adb pull指令下載下傳相應的apk檔案,并按着本節的方法進行分析。

繼續閱讀