android之插件式开发

最近公司项目中需求中有展场地图功能,由于地图的地点不确定行,不能马上提前开发好了,我的思路式使用插件式开发,在主程序中留下口子,在需要使用展场地图,在开发一个子的apk,让主程序下载调用。
前面说的就是需求,
我的思路很简单:在主程序中写一个activity专门负责加载子程序中的fragment(子程序的界面都用fragment写),
1,在主界面中写一个listview ,访问网络去去拿listview需要填充的数据,这里面的数据至少有我们要下载的的子apk的地址,和我们要加载的类的类名(方便使用类加载器加载)
2,当我们去点击这个listView中的的item的时候(第一次),有先去下载这个apk,然后在跳转到我们主程序的专门准备的fragment中去,(跳转的时候只是带上,现在后的apk路径,和我们要加载和个apk中的fragment得类名)
3,那么重点来了。想要子apk运行,我们需要做两件事,(1)我们要加载fragment类(2)资源。
akp在虚拟机中式怎么运行得 apk—dex–class
从写DexClassLoader,AssetManager,Resources,Theme去获取资源,
然后创建一个FrameLayout 我们有这个类的类名,用类加载器,去加载这个类,
开启getFragmentManager 将这个fragment填充到FragmeLayout中去,

水平有限,希望有高手能写比完善的框架,不啰嗦,直接上代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import dalvik.system.DexClassLoader;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.FrameLayout;

public class FragmentLoaderActivity extends Activity {
private DexClassLoader cl;
private AssetManager asm;
private Resources res;
private Theme thm;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();

    String path = intent.getStringExtra("path");

    File f = null;
    // 接受apk解压后的dex目录--outdex
    File fo = null;
    try {
        InputStream ins = new FileInputStream(path);
        byte[] bytes = new byte[ins.available()];
        ins.read(bytes);
        ins.close();

        f = new File(getApplication().getCacheDir(), "Dex");
        f.mkdir();
        f = new File(f, "FL_" + Integer.toHexString(path.hashCode()));

        FileOutputStream fos = new FileOutputStream(f);
        fos.write(bytes);
        fos.close();
        fo = new File(getApplication().getCacheDir(), "Dexout");
        fo.mkdir();

        DexClassLoader dcl = new DexClassLoader(f.getAbsolutePath(),
                fo.getAbsolutePath(), null, super.getClassLoader());
        cl = dcl;

        AssetManager am = AssetManager.class.newInstance();

        am.getClass().getMethod("addAssetPath", String.class)
                .invoke(am, f.getAbsolutePath());
        asm = am;

        Resources superRes = super.getResources();
        res = new Resources(am, superRes.getDisplayMetrics(),
                superRes.getConfiguration());
        thm = res.newTheme();
        thm.setTo(super.getTheme());

        // 前面准备工作完成了,现在开始加载了FrameLayput
        FrameLayout rootView = new FrameLayout(this);
        rootView.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
        rootView.setId(3);
        // 现在才添加view
        setContentView(rootView);
        String fragmentClass = getIntent().getStringExtra("class");// 要加载fragment的名称,我们从服务器中拿到的。
        Fragment fr = (Fragment) getClassLoader().loadClass(fragmentClass)
                .newInstance();
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(3, fr);
        ft.commit();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public ClassLoader getClassLoader() {
    return cl == null ? super.getClassLoader() : cl;
}

@Override
public AssetManager getAssets() {
    return asm == null ? super.getAssets() : asm;
}

@Override
public Resources getResources() {
    return res == null ? super.getResources() : res;
}

@Override
public Theme getTheme() {
    return thm == null ? super.getTheme() : thm;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值