Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
前言
近期做換膚功能,由于換膚程度較高,受限于平臺本身,實現起來較復雜,暫時擱置了該功能,但也積累了一些經驗,將分兩篇文章來寫這部分的內容,歡迎交流!
關鍵字:Android動態加載
?
聲明
歡迎轉載,但請保留文章原始出處:)?
博客園:http://www.cnblogs.com
農民伯伯: http://over140.cnblogs.com?Android中文Wiki:http://wikidroid.sinaapp.com
?
正文
一、前提
目的:動態加載SD卡中Apk的類。
注意:被加載的APK是未安裝的。
相關:本文是本博另外一篇文章:Android動態加載jar/dex的升級版。
?
截圖: 成功截圖:
?
二、準備
準備被調用Android工程:TestB
ITest
public?interface?ITest?{????String?getMoney();
}
? TestBActivity
public?class?TestBActivity?extends?Activity?implements?ITest?{????/**Called?when?the?activity?is?first?created.?*/
????@Override
????public?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.main);
????}
????@Override
????public?String?getMoney()?{
????????return?"1";
????}
}
代碼說明:很簡單的代碼。將生成后的TestB.apk拷貝到SD卡的根目錄下。
?
三、調用?
調用工程TestA
public?class?TestAActivity?extends?Activity?{????/**Called?when?the?activity?is?first?created.?*/
????@Override
????public?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.main);
????????String?path?=?Environment.getExternalStorageDirectory()?+?"/";
????????String?filename?=?"TestB.apk";
????????DexClassLoader?classLoader?=?new?DexClassLoader(path?+?filename,?path,
????????????????null,?getClassLoader());
????????try?{
????????????Class?mLoadClass?=?classLoader.loadClass("com.nmbb.TestBActivity");
????????????Constructor?constructor?=?mLoadClass.getConstructor(new?Class[]?{});
????????????Object?TestBActivity?=?constructor.newInstance(new?Object[]?{});
????????????
????????????Method?getMoney?=?mLoadClass.getMethod("getMoney",?null);
????????????getMoney.setAccessible(true);
????????????Object?money?=?getMoney.invoke(TestBActivity,?null);
????????????Toast.makeText(this,?money.toString(),?Toast.LENGTH_LONG).show();
????????????
????????}?catch?(ClassNotFoundException?e)?{
????????????e.printStackTrace();
????????}?catch?(SecurityException?e)?{
????????????e.printStackTrace();
????????}?catch?(NoSuchMethodException?e)?{
????????????e.printStackTrace();
????????}?catch?(IllegalArgumentException?e)?{
????????????e.printStackTrace();
????????}?catch?(InstantiationException?e)?{
????????????e.printStackTrace();
????????}?catch?(IllegalAccessException?e)?{
????????????e.printStackTrace();
????????}?catch?(InvocationTargetException?e)?{
????????????e.printStackTrace();
????????}
????}
}
執行的時候可以發現會自動生成TestB.dex文件。動態加載方面還可以搜索一下"Java動態加載"方面的資料,很有參考價值。可以發現比Android動態加載jar/dex使用起來方便得多。
?
四、下載
TestA.zip
TestB.zip
?
五、注意
6.1 別忘了加上SDCARD的寫權限:
android.permission.WRITE_EXTERNAL_STORAGE
6.2 同樣注意,不要再兩個工程包含package和名稱相同的接口,否則報錯。(參見Android動態加載jar/dex的后期維護)
?
六、擴展閱讀
探秘騰訊Android手機游戲平臺之不安裝游戲APK直接啟動法
(強烈推薦:QQ游戲動態調用Activity的方法:通過ClassLoader,loadClass Activity類,然后分別在主工程的onDestroy、onKeyDown、onPause、onRestart、onResume等生命周期方法中反射調用(Method、invoke)子工程的類方法來模擬實現整個生命周期。此外巧妙的通過解壓縮APK文件來獲取游戲的資源)
?
Android中文Wiki:DexFile
?
?
七、缺點
6.1 由于是使用反射,無法取得Context,也就是TestBActivity與普通的類毫無區別,沒有生命周期。
?
八、推薦
Android版 程序員專用搜索
轉載于:https://www.cnblogs.com/calow/p/3643222.html
總結
以上是生活随笔為你收集整理的Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 买的优盘加密软件怎么用 优盘加密软件购买
- 下一篇: 怎么打开u盘模式 如何启动U盘模式