日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...

發布時間:2024/10/12 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的类...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。