Android筆記八.Intent對象的使用及.apk反編譯

來源:互聯網
上載者:User

Android筆記八.Intent對象的使用及.apk反編譯
Intent對象的使用及.apk反編譯Jiangdg_VIPhttp://blog.csdn.net/u012637501 前三節主要學習了Intent對象的作用、屬性以及不同Activity之間值的傳遞,這節將著重學習Intent對象的用法。在我的語音辨識項目中,通過使用Inteng對象來啟動應用內組件、系統應用程式以及第三方應用程式(如QQ、等)。一、Intent對象開發方法 首先,我們還是先學習下Intent對象啟動組件(應用)有哪幾種方法:1.利用Intent對象的Component屬性 使用這種方法的前提知道組件的或第三方應用程式的包名、類名,來啟動應用程式內組件、第三方應用程式。Intent的Component屬性需要要接受一個ComponentName對象,一個基本ComponentName需要指定包名和類名,這可以唯一地確定一個組件類。基本格式: ComponentName comp=new ComponentName(包名,類名); intent.setComponent(comp); ComponentName對象包括以下幾種構造器: a.ComponentName(String pkg,String cls):建立pkg所在包下的cls類所對應的組件(字串形式) b.ComponentName(Context pkg,String cls):建立pkg所在包下的cls類所對應的組件 c.ComponentName(Context pkg,Classcls):建立pkg所在包下的cls類所對應的組件(上下文)應用舉例:(1)intent啟動自身組件

Intent intent=new Intent();ComponentName comp=new ComponentName(PocketSphinxDemo.this,help.class );//使用第三種構造器intent.setComponent(comp);startActivity(intent);
注意:這裡PocketSphinxDemo.this指定的是我們應用程式的包,help.class為包內將要啟動的組件類。 (2)intent啟動第三方應用程式
Intent intent=new Intent();intent.setClassName("com.tencent.mobileqq",                                "com.tencent.mobileqq.activity.SplashActivity");startActivity(intent);
注意:關於第三方應用程式的包名(com.tencent.mobileqq)、類名()com.tencent.mobileqq.activity.SplashActivity,我們可以通過反編譯其.apk擷取AndroidManifest.xml檔案的"package"屬性,以及action聲明為MAIN常量的"android:name"屬性,具體如何反編譯擷取我將會在下面文章中詳細述說。(3)intent啟動系統程式 這部分我覺得使用方法可能會比較好,這裡就不說了。 2.利用setClass啟動組件 使用這種方法的前提知道組件的或第三方應用程式的包名、類名,來啟動應用程式內組件、第三方應用程式。setClass*為Intent類的成員方法,功能與Intent對象的Component屬性一樣,都是通過intent指定需要啟動的組件。其也有三種形式:a.setClass(Context packageContext,Classcls):設定該Intent將要啟動的組件的對應類b.setClassName(Context packageContext,String className): 設定該Intent將要啟動的組件的對應類名c.setClassName(String packageName,String className):設定該Intent將要啟動的組將的對應類名 其中,Android應用的Context代表了訪問該應用環境資訊的介面,而Android應用的包名則作為應用的唯一標識,即Context對象與該應用的包名有一一對應的關係。setClass方法就是指定包名和組件的實作類別。應用舉例:(1)intent啟動自身組件
Intent intent=new Intent();intent.setClassName(PocketSphinxDemo.this,help.class );//使用第三種構造器startActivity(intent);
注意:這裡PocketSphinxDemo.this指定的是我們應用程式的包,help.class為包內已經實現了的將要啟動的組件類(2)intent啟動第三方應用
Intent intent=new Intent();intent.setClassName("com.tencent.mobileqq","com.tencent.mobileqq.activity.SplashActivity");startActivity(intent);
注意:關於第三方應用程式的包名(com.tencent.mobileqq)、類名()com.tencent.mobileqq.activity.SplashActivity,我們可以通過反編譯其.apk擷取AndroidManifest.xml檔案的"package"屬性,以及action聲明為MAIN常量的"android:name"屬性,具體如何反編譯擷取我將會在下面文章中詳細述說。 3.利用intent-filter配置(Intent對象的5個屬性) Intent的Action、Category屬性都是一個普通的字串,其基本思想是:在發出"意圖"的組件中,調用Intent成員方法設定好其計劃啟動組件的一些特徵,然後在接收"意圖"組件的AndroidManifest.xml檔案中的配置是否符合"意圖"要求,從而確定是否能被啟動。其中: Action屬性代表該Intent所需要完成的一個抽象"動作"; Category屬性用於為Action增加額外的附加類別資訊 Data屬性用於向Action屬性提供操作的資料,且其接受一個Uri對象 Type屬性用於指定該Data所指定Uri對應的MIME類型,這種MIME類型可以是任何自訂的MIME類型,只要符合abc/xyz格式的字串即可 Extras屬性用於多個Action之間進行資料交換,即值傳遞,通常用於不同Activity之間的資料傳遞交換 Flags屬性用於該Intent添加一些額外的控制旗標,Intent可調用addFlags()方法來為Intent添加控制旗標。 (1)利用intent-filter配置啟動系統程式 由於Android手機中的系統程式,其屬性的設定可以說是通用的,所以使用這種方法比前面的方法要方便可靠。範例程式碼如下:
啟動系統相機Intent intent=new Intent();intent.setAction(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); //啟動相機appstartActivity(intent); 啟動瀏覽器Uri uri=Uri.parse("http://blog.csdn.net/u012637501"); Intent intent=new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent);
(2)利用intent-filter啟動應用自身組件a.建立一個Intent對象,並自訂字串設定給intent的屬性
Intent intent=new Intent(); //建立一個Intent對象String data="lee://www.fkjava.org:8888/mypath";    //自訂字串Uri uri=Uri.parse(data); //將字串轉換為Uriintent.setAction(Intent.ACTION_VIEW);intent.setData(uri); //設定Intent對象Data屬性startActivity(intent);或者Intent intent=new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));startActivity(intent);  
b.實現想要啟動的一個及以上組件(比如SecondaryActivity)c.在AndroidManifest.xml中為組件(如Activity)添加一個元素並設定元素中的相關內容
   可以全部設定,也可以選擇性設定。
經過上述設定,intent就會根據其他組件的元素裡所能匹配的項依次列出符合intent條件的一系列組件。
二、Intent對象啟動第三方應用 Intent對象除了能給啟動應用自身組件、系統應用,還可以啟動第三方應用,比如QQ、、檔案管理工具等。由於第三方應用的屬性是各應用開發商自訂的,不能調用Intent預定義的相關屬性常量。為了成功啟動第三方應用,我們可以利用Intent對象的Component屬性或者調用Intent類的setClassName方法,通過指定第三方應用的包名、類名來啟動。 由於第三方應用大部分都是封裝好的,為了從AndroidManifest.xml工程檔案中擷取應用的包名、類名以及擷取相關的Java格式源碼,我們可以對應用安裝包(.apk)進行反編譯。 1.搭建反編譯環境(1)Win7 x86(2)Fedora14或cygwin,即linux編譯環境。這裡我直接使用cygwin, Cygwin相當於Windows下的Linux環境。具體的安裝配置方法配置,詳見我這一篇博文:http://blog.csdn.net/u012637501/article/details/40480823(3)反編譯工具:http://download.csdn.net/detail/u012637501/8166977 2.apk反編譯產生程式的XML配置、圖片、語言等資源檔

(1)下載上述反編譯工具包,開啟apk2java目錄下的apktool1.4.1檔案夾,內含三個檔案:aapt.exe,apktool.bat,apktool.jar <喎?"http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141119/2014111908391056.png" alt="\">

註:裡面的apktool_bk.jar是備份的老版本,最好用最新的apktool.jar

(2)切換到apktool1.4.1檔案夾,使用apktool.bat工具進行反編譯

a.切換命令:

b.編譯命令:


apktool.bat 命令列解釋:apktool.bat d -f [apk檔案 ] [輸出檔案夾]

c.result檔案夾下,反編譯的結果:


3.重新打包成apk

將反編譯完的檔案重新打包成apk,很簡單,輸入apktool.bat b abc123(你編譯出來檔案夾)即可,命令如下:


打包apk後的檔案在目錄C:\HelloAndroid下,產生了兩個檔案夾:

build

dist

其中,打包產生的HelloAndroid.apk,在上面的dist檔案夾下.

4.apk反編譯得到Java原始碼

下載上述反編譯工具包,開啟apk2java目錄下的dex2jar-0.0.9.9檔案夾,內含apk反編譯成java源碼工具,以及源碼查看工具。

dex2ja:rapk反編譯工具,是將apk中的classes.dex轉化成jar檔案

jdgui:源碼查看工具,是一個反編譯工具,可以直接查看反編譯後的jar包原始碼

dex2jar 和 jdgui 最新版本下載,分別見google code:

dex2jar(google code)

jdgui(google code),最新版本請見 官方

(1)首先將apk檔案尾碼改為zip並解壓,得到其中的classes.dex,它就是java檔案編譯再通過dx工具打包而成的,將classes.dex複製到dex2jar.bat所在目錄dex2jar-0.0.9.9檔案夾。

(2)在命令列下定位到dex2jar.bat所在目錄,運行dex2jar.bat classes.dex產生classes_dex2jar.jar

(3)進入jdgui檔案夾雙擊jd-gui.exe,開啟上面產生的jar包classes_dex2jar.jar,即可看到原始碼了,如:

HelloAndroid源碼在反編譯前後的對照如下:

經過以上幾步我們就可以成功的對apk安裝包進行反編譯,擷取源碼。其實,如果我們只是反編譯用來實現Intent啟動第三方應用只需操作第二步即可獲得安裝包的AndroidManifest.xml工程檔案。 如inten啟動.apk 1.反編譯".apk",查看AndroidManifest.xml工程檔案擷取包名、主Activity類名

2.intent設定
Intent intent=new Intent();intent.setClassName("com.tencent.mm","com.tencent.mm.app.MMApplication");startActivity(intent);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.