前兩章用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(主應用和插件都是),因此在服務器上包路徑是不能夠重複了(跟應用商店同樣),若是你要用以上的源碼實驗請修改成你本身的包路徑再上傳。