天天看点

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

正文

  一、前提

    目的:动态加载SD卡中Apk的类。

    注意:被加载的APK是未安装的。

    截图: 成功截图:

      

  二、准备

    准备被调用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);

    }

    public String getMoney() {

        return "1";

    代码说明:很简单的代码。将生成后的TestB.apk拷贝到SD卡的根目录下。

  三、调用 

    调用工程TestA

public class TestAActivity extends Activity {

        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) {

        } catch (NoSuchMethodException e) {

        } catch (IllegalArgumentException e) {

        } catch (InstantiationException e) {

        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {

        }

  四、下载

  五、注意

    6.1  别忘了加上SDCARD的写权限:

      android.permission.WRITE_EXTERNAL_STORAGE

  六、扩展阅读

    (强烈推荐:QQ游戏动态调用Activity的方法:通过ClassLoader,loadClass Activity类,然后分别在主工程的onDestroy、onKeyDown、onPause、onRestart、onResume等生命周期方法中反射调用(Method、invoke)子工程的类方法来模拟实现整个生命周期。此外巧妙的通过解压缩APK文件来获取游戏的资源)

  七、缺点

    6.1  由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。

  八、推荐

结束 

  忙着换工作、忙着把翻译组转动Wiki平台、忙着推广翻译组...忙这忙那的,博客已经有近2个月没有写Android方面的文章,终于又可以回来,继续挤时间来写博客,与大家一同探讨与分享。

本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/844928,如需转载请自行联系原作者

继续阅读