VirtualAPK宿主和插件交互解析

VirtualAPK最大的特色在于支持宿主和插件之间的数据交互,在官方文档中也介绍了VirtualAPK数据交互的原理方法,但是我相信还是有很多人对此一头雾水,首先上一张官网的交互教程:
这里写图片描述

一、数据交互原理

官网中提到了aar这个文件,这是安卓特有的一种压缩格式,对于jar文件大家肯定都不陌生,jar文件可以理解为代码的压缩文件,而aar可以理解为代码+res资源的压缩文件。有人看到这个aar肯定第一时间还是懵逼,aar文件作为数据容器,宿主和插件都可以通过这个容器存取数据。我用一张图来描述我对VirtualAPK数据交互的理解:
这里写图片描述

二、代码实现

1、创建aar文件

**新建一工程,将modle下的gradle文件最上边一行改为:apply plugin: ‘com.android.library’,并把applicationId删掉,意味着这个modle是作为library来创建使用的。这里有个地方应注意:library的sdkVersion应和项目保持一致。
**新建Bean类,作为宿主和插件数据交互的数据对象,这个bean对象只有一个name字段,实际应用中根据自己实际项目需求设计。

public class Bean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

**新建BeanManager类来管理数据,内部使用静态方法用于获取bean

public class BeanManager {
    private static Bean bean;

    public static void init(Bean bean) {
        BeanManager.bean = bean;
    }

    public static Bean getInstance() {
        return bean;
    }
}

**写好这两个类后,就可以打包生成aar文件了,这里我们将打包生成的aar文件命名为library.aar,生成方法可以参考这篇博客:http://blog.csdn.net/pbm863521/article/details/54317757
2、宿主应用aar文件
**宿主工程引用aar文件,将aar文件导入宿主工程的libs文件夹下,然后在gradle中配置library.aar为工程应用(注意重新build工程):这里写图片描述
**在宿主工程中使用该aar:

public class MainActivity extends Activity {
    private Button buttonOne;
    private Button buttonTwo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.host_activity_main);
        buttonOne = (Button) findViewById(R.id.buttonOne);
        //加载插件
        String path = Environment.getExternalStorageDirectory().getAbsolutePath().toString() + "/test.apk";
        File plugin = new File(path);
        try {
            PluginManager.getInstance(this).loadPlugin(plugin);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //注意这里!!!,就是刚才的library.aar中定义的两个类,在这可以直接使用
        Bean bean = new Bean();
        bean.setName("haoxinlei");
        BeanManager.init(bean);
        //点击按钮后,打开插件的一个页面,在插件的页面中获取这个数据
        buttonOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (PluginManager.getInstance(MainActivity.this).getLoadedPlugin("com.plugin") == null) {
                    Toast.makeText(MainActivity.this, "加载插件失败", Toast.LENGTH_SHORT).show();
                    return;
                }
                Intent intent = new Intent();
                intent.setClassName("com.plugin", "com.plugin.PluginLayoutActivity");
                startActivity(intent);
            }
        });

    }
}

3、插件应用aar文件
**插件中使用library.aar文件的方法和宿主一样不再赘述,直接上插件中获取数据的代码。

public class PluginLayoutActivity extends Activity {
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.plugin_layout);
        text = (TextView) findViewById(R.id.text);
        text.setText("你好,这是第一个插件");
        //注意这里!!在这里直接获取数据。
        String str = BeanManager.getInstance().getName();
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }
}

ok,到这里,整个交互就完成了,插件中获取到了宿主的数据。VirtualAPK在打包插件的时候,会自动将插件gradle中和宿主一样的引用移除,当在宿主中打开插件的Acticity时,插件就会自动使用宿主中的引用了。如有错误,欢迎拍砖!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值