前两章用apkplug框架实现了两个基本的功能,但它们都是在本地安装测试的,在实际开发过程中我们肯定是需要与服务器联网将更新的插件远程推送给用户手机客户端。今天利用apkplug提供的插件托管服务轻松实现插件的远程部署与客户端更新。
一,还是利用上一章所建的主应用,只是在主应用的assert文件夹中添加一个插件"BundleService0.0.2.apk",该插件是apkplug官网提供服务插件,它封装了与托管服务器通讯,文件下载,文件缓存等功能只留出了简单易用的接口给开发者,开发者通过接口可以任意设计自己的应用界面而不必关心通讯细节。
二,编写我们自己的应用更新插件
首先新建一个工程MyApkplugService 照例编写插件所必须的几个java类和plug.xml文档。工程结构如图
在这个插件中我们除了需要添加osgi.jar包以外还需要添加installService0.0.2.jar来与我们的BundleService0.0.2.apk插件通讯。
环境搭建好了现在我们可以在MyApkplugService通过与BundleService0.0.2.apk插件通讯更新下载插件了。
三 编写自己的应用管理插件
BundleService0.0.2.apk插件对插件管理的整个过程都封装的很好,提供给开发者一个灵活而方便的操作方式,其接口主要有
1.appSearch.java 通过这个接口我们可以任意组合查询条件如插件 appid,插件名称 appname,查询页page,插件关键词b_keywords,插件添加时间排序方式b_order等
2.appDownload.java 通过这个接口可以实现插件的自动下载安装
3.checkupdate.java 通过这个接口我们可以查询服务端插件与本地插件的差异,进而进行以后的操作
简单说明了托管服务的接口下面就通过具体的代码讲解其使用过程
我们的MyApkplugService只使用一个MainActivity做为显示界面。
首先我们编写一个search()函数来查找BundleService0.0.2.apk提供的appSearch接口,通过这个接口我们就可以查询服务器上的插件了代码入下
01 |
/** |
02 |
* 插件搜索服务 appSearch 为BundleService提供的一个插件搜索服务
|
03 |
* @param bean appSearchBean 可以填写你搜索插件的一些搜索条件 比如按关键词搜索 按时间排序 按模糊名称搜索等
|
04 |
* @param callback 为服务结果回调接口 开发者可以通过该接口可以得知返回结果进行后续操作
|
05 |
*/
|
06 |
public void search(appSearchBean bean,AppSearchCallBack callback){
|
07 |
ServiceReference reference=BundleContextFactory.getInstance().getBundleContext()
|
08 |
.getServiceReference(appSearch. class .getName());
|
09 |
if ( null !=reference){
|
10 |
//获取appSearch服务因为BundleService自动启动所以服务应该能搜索到
|
11 |
appSearch service=(appSearch) BundleContextFactory.getInstance().getBundleContext()
|
12 |
.getService(reference);
|
13 |
if (service!= null ){
|
14 |
//搜索到服务就调用该服务与云平台通讯
|
15 |
service.search(bean,callback);
|
16 |
}
|
17 |
BundleContextFactory.getInstance().getBundleContext()
|
18 |
.ungetService(reference);
|
19 |
}
|
20 |
}
|
当我们获取到appSearch 接口以后便可以service.search(appSearchBean bean,AppSearchCallBack callback);方法进行查询了。
appSearchBean.java类是一个查询类bean我们可以传入我们的查询条件
AppSearchCallBack.java类是一个回调函数,异步查询完成以后的值将通过这个回调函数返回给我们
以下便是我们初始化时查询代码
01 |
//从云平台查询插件 |
02 |
public void updataDate(){
|
03 |
//初始化查询appSearchBean 查询该主应用中已添加插件
|
04 |
appSearchBean bean= new appSearchBean();
|
05 |
//该插件关键词为 ‘test’ (再后台管理平台设置)
|
06 |
bean.setB_keywords( "test" );
|
07 |
//按添加到主应用时间降序排列 时间分app上传时间和添加到主应用分组的时间
|
08 |
bean.setG_order(appSearchBean.order_desc);
|
09 |
//2013-10-15日上传或更新的应用
|
10 |
bean.setB_btime( "2013-10-15" );
|
11 |
//每次获取应用条数最多50条
|
12 |
bean.setPagenum( 10 );
|
13 |
//当前查询第0页
|
14 |
bean.setPage( 0 );
|
15 |
if (apps.size()== 0 ){
|
16 |
//调用 BundleService插件中的 appService服务查询
|
17 |
search(bean, new AppSearchCallBack(){
|
18 |
@Override
|
19 |
public void onSuccess( int stutas,msg msg,appSearchBean bean) {
|
20 |
//如果查询成功
|
21 |
if (stutas>= 0 ){
|
22 |
if (msg.getStutes()>= 0 ){
|
23 |
//如果云端返回的数据正确
|
24 |
//关于msg类详细请看api文档
|
25 |
//从msg类中获取符合查询条件的app
|
26 |
//通过appBean 开发者又可以调用BundleService提供的“插件下载服务”下载或更新指定的插件了
|
27 |
List<appBean> aps=(List)msg.getMsg();
|
28 |
for ( int i = 0 ; i < aps.size(); i++) {
|
29 |
appBean ab=aps.get(i);
|
30 |
apps.add(ab);
|
31 |
}
|
32 |
//显示到页面商
|
33 |
MainActivity. this .getListView().post( new Runnable(){
|
34 |
public void run(){
|
35 |
adapter.notifyDataSetChanged();
|
36 |
}
|
37 |
});
|
38 |
}
|
39 |
} else {
|
40 |
//查询错误的操作
|
41 |
}
|
42 |
}
|
43 |
@Override
|
44 |
public void onFailure( int arg0, final String arg1) {
|
45 |
//查询错误的操作
|
46 |
}
|
47 |
});
|
48 |
}
|
49 |
}
|
很简单吧,通过这样就完成了客户端的开发工作。
四 注册帐号-->将主应用添加到服务器上 如图
添加完成以后我们也可以看该应用一个添加了的插件
设置插件的关键词(可以做为我们本地查询的一个条件)
至此整个过程便都操作完毕了,我们可以运行应用查看效果了 如图
点击运行
最后源码奉上
最后注意的是服务器以应用的包路径做为ID(主应用和插件都是),所以在服务器上包路径是不可以重复了(跟应用商店一样),如果你要用以上的源码实验请修改为你自己的包路径再上传。