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