zoukankan      html  css  js  c++  java
  • 动态加载类

    引用:http://www.2cto.com/kf/201204/129646.html

    正文
      一、前提
        目的:动态加载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);
        }

        @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:http://www.2cto.com/uploadfile/2012/0429/20120429095226945.zip

        TestB.zip:http://www.2cto.com/uploadfile/2012/0429/20120429095304576.zip
        
     
      五、注意
        6.1  别忘了加上SDCARD的写权限:
          android.permission.WRITE_EXTERNAL_STORAGE
        6.2  同样注意,不要再两个工程包含package和名称相同的接口,否则报错。
     
      六、扩展阅读
        探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法http://www.2cto.com/kf/201204/129645.html
        (强烈推荐:QQ游戏动态调用Activity的方法:通过ClassLoader,loadClass Activity类,然后分别在主工程的onDestroy、onKeyDown、onPause、onRestart、onResume等生命周期方法中反射调用(Method、invoke)子工程的类方法来模拟实现整个生命周期。此外巧妙的通过解压缩APK文件来获取游戏的资源)
     
        Android中文Wiki:DexFilehttp://wikidroid.sinaapp.com/DexFile
     
     
      七、缺点
        6.1  由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。
     
      八、推荐
        Android版 程序员专用搜索http://www.google.com/cse/home?cx=001890648196184854956:bmrc5dqh-7y&hl=zh-CN
     
    结束
      忙着换工作、忙着把翻译组转动Wiki平台、忙着推广翻译组...忙这忙那的,博客已经有近2个月没有写Android方面的文章,终于又可以回来,继续挤时间来写博客,与大家一同探讨与分享。

  • 相关阅读:
    批量新增百万条数据 十百万条数据
    sqlserver 组内排序
    EF ++属性会更新实体
    Entity Framework Core: A second operation started on this context before a previous operation completed
    abp Cannot access a disposed object. A common cause of this error is disposing
    abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
    hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
    EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
    datatable to entiy list 不支持可空类型和枚举类型
    webapi 设置不显示接口到swaggerUI
  • 原文地址:https://www.cnblogs.com/sode/p/2961914.html
Copyright © 2011-2022 走看看