代码之家  ›  专栏  ›  技术社区  ›  Enrico Carlesso

运行外部代码/应用程序的Android应用程序?

  •  1
  • Enrico Carlesso  · 技术社区  · 14 年前

    我需要一个Android应用程序,它应该能够从网络上获取数据(可能是.apk或.jar)并从中启动“某物”。

    如果这是一个“平凡”的班级,那就没问题了。这是我的 装载机

    package com.m31.android.urlload;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.lang.ClassLoader;
    import java.net.URL;
    
    import dalvik.system.PathClassLoader;
    import dalvik.system.DexClassLoader;
    
    
    public class Loader extends ClassLoader {
        public Loader() throws IOException {
            super(Loader.class.getClassLoader());
        }
    
        public Class loadClass(String className) throws ClassNotFoundException {
             return findClass(className);
        }
    
        private String fetch_package(String url) throws IOException {
            BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
            FileOutputStream fos = new FileOutputStream("/mnt/sdcard/_plugins/plugin1.jar");
            BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
            byte data[] = new byte[1024];
            int count;
            while((count = in.read(data,0,1024)) > 0) {
                bout.write(data,0,count);
            }
            bout.close();
            in.close();
            return "/mnt/sdcard/_plugins/plugin1.jar";
        }
    
        public Class findMyClass(String className, String url) throws IOException, ClassNotFoundException {
            String path = fetch_package(url);
            DexClassLoader pcl = new DexClassLoader(path, "/mnt/sdcard/_dex/", null, this);
            return pcl.loadClass(className);
    
    
        }
    }
    

    问题是我要执行的代码看起来非常像一个应用程序,它应该有一个“简单”的视图和一些交互。

    我无法调用下载类的“onCreate”方法。

    我想我有三条街道:

    1. 我寻找一种方法,静默地安装应用程序,然后运行它(是否可能?);
    2. 在您的帮助下,我了解如何在自己的应用程序内部(使用自己的r和所有东西)初始化第二个“应用程序”;
    3. 我编写了主程序来从网络中获取数据并动态地构建页面。

    所以,我绝对需要你的帮助!

    2 回复  |  直到 13 年前
        1
  •  0
  •   Walter Mundt    14 年前

    我很确定你不能悄悄地安装一个新的应用程序。此外,我一直找不到任何方法在运行时将新活动注册到现有应用程序中。我想您可以编写一个wrapperActivity,将所有调用传递给动态加载的另一个调用,但这仍然会留下无法解决的问题,即无法加载资源数据。

    最后,您可能需要编写代码来完全避免使用Android资源系统(可能但很难),或者只需要使用WebView和HTML来处理动态位(更难缓存,更不太本土化,但实现起来更简单)。

        2
  •  1
  •   CommonsWare    14 年前

    我寻找一种方法,静默地安装应用程序,然后运行它(是否可能?);

    不,这是不可能的。那将是一个安全问题。

    在你的帮助下,我知道如何 初始化第二个“应用程序” 在我自己的一个(有自己的R和 所有的东西);

    我怀疑这将是在困难到不可能的范围内。

    我编写了我的主程序,从网络中获取数据,并按常规构造页面。

    当然,有一些东西符合这个描述,应该是有效的。就个人而言,我建议您只使用HTML5,它可能由一个WebView托管,因为HTML是一个用于动态生成uis(如本网页所示)的真正可行的解决方案。