VirtualAPK宿主和插件交互解析

来源:互联网 发布:linux root权限 编辑:程序博客网 时间:2024/06/04 19:43

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时,插件就会自动使用宿主中的引用了。如有错误,欢迎拍砖!

原创粉丝点击