前两章用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  }

很简单吧,通过这样就完成了客户端的开发工作。

四 注册帐号-->将主应用添加到服务器上 如图

将插件apk上传到服务器上并且将插件与主应用绑定 如图

添加完成以后我们也可以看该应用一个添加了的插件

设置插件的关键词(可以做为我们本地查询的一个条件)

至此整个过程便都操作完毕了,我们可以运行应用查看效果了 如图

点击运行

最后源码奉上

最后注意的是服务器以应用的包路径做为ID(主应用和插件都是),所以在服务器上包路径是不可以重复了(跟应用商店一样),如果你要用以上的源码实验请修改为你自己的包路径再上传。

android模块化app开发-3远程动态更新插件的更多相关文章

  1. Android UI:机智的远程动态更新策略

    问题描述 做过Android开发的人都遇到过这样的问题:随着需求的变化,某些入口界面通常会出现 UI的增加.减少.内容变化.以及跳转界面发生变化等问题.每次发生变化都要手动修改代码,而入口界面通常具有 ...

  2. android模块化app开发-4为APP减负

    现在android应用中一个趋势是应用越来越大,免去游戏不谈普通APP也是一个个的体积直线增长.这里面除了业务增长外各种接口jar包的对接也占了不少比重.像广告SDK,统计SDK,支付SDK等这些我们 ...

  3. android模块化app开发笔记-2插件间布局文件共享

    android编程时布局文件,图片资源等都是放在同一个文件夹下,这样照成一个问题就是我们想重用UI布局文件和图片时就还需要其分离这些资料,相信大部分android程序员都遇到过这样的问题,其痛苦程度不 ...

  4. 【Android】1.0 第1章 C#之Android手机App开发

    分类:C#.Android.VS2015:创建日期:2016-01-20 目前Android在全世界市场上大约有75%的占有率,国人Android手机的持有比例更甚,甚至达到90%以上.因此搞计算机的 ...

  5. windows8 APP开发的远程调试

    Win8上面的App开发远程调试: 这里先简单介绍一下对于win8的app的远程调试,环境设置:开发机器装有vs2012的win8系统,目标机器为虚拟机,预装win8系统. 1. 在虚拟机上安装vis ...

  6. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  7. android 编译环境 & 开发教程 【持续更新】

    一. 优秀博文推荐 1.ubuntu 搭建 android源码编译环境 ubuntu14.04LTS android 源码编译环境的搭建 2.开源网站 2.android 开源 网站 2015最流行的 ...

  8. android 反纠结app开发: 在线程中更新view

    大体上想实现一个思路: 对一个view 的内容进行不停地变化, 通过按钮停止这种变化,以达到随机选择的目的. 开发过程中 使用textview 模拟,  建立线程 mythread = new Thr ...

  9. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

随机推荐

  1. POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)

    题意:有两只青蛙,a在第一个石头,b在第二个石头,a要到b那里去,每种a到b的路径中都有最大边,求所有这些最大边的最小值.思路:将所有边长存起来,排好序后,二分枚举答案. 时间复杂度比较高,344ms ...

  2. [转] ADO.NET实体框架引发争论

    转自:http://developer.51cto.com/art/200811/76356.htm 2008-11-11 14:00 朱永光译 infoq 我要评论(0) 一个在ADO.NET实体框 ...

  3. Ubuntu环境下Hadoop1.2.1, HBase0.94.25, nutch2.2.1各个配置文件一览

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  4. Cache 应用程序数据缓存

    System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类.此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和数据集.它还为这些对象提供了失效 ...

  5. 用Delphi创建服务程序

    用Delphi创建服务程序 日期:2005年11月29日 作者:sunmohe 人气: 3154 查看:[大字体 中字体 小字体] Windows 2000/XP和2003等支持一种叫做"服 ...

  6. lintcode :Partition List 链表划分

    题目: 链表划分 给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前. 你应该保留两部分内链表节点原有的相对顺序. 样例 给定链表 1->4->3->2-& ...

  7. Linux中断(interrupt)子系统

    Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理 ...

  8. SDK 与MFC

    SDK 就是Software Development Kit 软件开发包MFC 就是Microsoft Foundation Classes 微软函数类库.是以C++类的形式封装了Windows的AP ...

  9. Spring两种实现AOP的方式

    有两种实现AOP的方式:xml配置文件的方式和注解的形式 我们知道通知Advice是指对拦截到的方法做什么事,可以细分为 前置通知:方法执行之前执行的行为. 后置通知:方法执行之后执行的行为. 异常通 ...

  10. 利用PC创建一个无线接入点

    win7 创建虚拟接入点,修改接入点名称和密码,然后存为bat文件,以管理员模式运行 netsh wlan set hostednetwork mode=allow ssid=APName key=p ...