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