標籤:自動更新 友盟 android 手動更新 靜默更新
Android從零單排之自動跟新
轉載請註明出處:http://blog.csdn.net/crazy1235/article/details/45584621
自動更新原理
當我們發布我們的應用程式的時候,肯定會想到後續版本的更新,那麼該怎麼對我們的程式進行更新呢?
更新APK的原理實際上就是比較程式中的AndroidManifest.xml中的versionCode進行對比,如果發現更高版本的code,則代表有新版本的程式發布,此時就可以對使用者提示“請更新新版本”。
友盟自動更新介紹
開發人員當然可以自己寫一個service去伺服器上讀取apk檔案中的versionCode值,然後做比對進行分析。但是如果開發時間比較緊迫的情況下,使用第三方寫好的工具,可是方便的多了。畢竟有了輪子,幹嘛還要造???
友盟自動更新
使用友盟的更新服務,就需要你把應用上傳到它的伺服器上,然後整合好友盟自動更新服務的apk,會去檢測開發人員上傳的應用版本資訊,如果探索服務器上的版本更高,就會提示使用者有新的應用版本,然後就可以下載新版應用進行安裝。
友盟支援多種更新方式:自動跟新、手動更新、靜默更新。
準備工作
首先需要去官網下載SDK,地址:http://www.umeng.com/component_update
下載下來SDK之後,會看到有三個檔案夾:分別是demo,jar包和res資源檔
- 將libs下的檔案拷貝到你的項目中去,其中libs/armeabi/libbspatch.so檔案是用於支援累加式更新功能的庫。
- 將res檔案拷貝到項目中,友盟的資源檔都是以umeng_開頭。
- 配置AndroidManifest.xml檔案:
-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.INTERNET"></uses-permission>
<meta-data android:name="UMENG_APPKEY" android:value="你的APPKEY" /> <meta-data android:name="UMENG_CHANNEL" android:value="Channel ID" />
<service android:name="com.umeng.update.net.DownloadingService" android:process=":DownloadingService" ></service><activity android:name="com.umeng.update.UpdateDialogActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" ></activity>
OK,準備工作已經完畢。
自動更新
自動更新的意思就是:當開啟應用之後,判斷網路然後主動去檢測版本更新,如果有更新,則提示使用者下載更新。
自動更新代碼很簡潔:
UmengUpdateAgent.update(this);
採用這種方式,會彈出友盟編寫的對話方塊:
不過這種介面有點醜。
我們下面來對更新添加監聽,然後自訂彈出框:
/** * 顯示更新對話方塊 * * @param updateResponse * @param context */UmengUpdateAgent.setDefault(); UmengUpdateAgent.setUpdateOnlyWifi(false); UmengUpdateAgent.setUpdateAutoPopup(false); UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() { @Override public void onUpdateReturned(int statusCode, UpdateResponse updateResponse) { Toast.makeText(MainActivity.this, statusCode + "", 1000).show(); if (statusCode == UpdateStatus.Yes && updateResponse != null) { showUpdateDialog(updateResponse); } } }); UpdateConfig.setDebug(true); UmengUpdateAgent.setRichNotification(true); UmengUpdateAgent.update(getApplicationContext());
setDefault():恢複預設設定。如果應用中不止一次調用了檢測更新的方法,每次的設定並不一樣的話,就需要先恢複預設設定,然後在進行設定別的參數。
setUpdateOnlyWifi():設定是否之後再wifi環境下檢測。
setDeltaUpdate(): 累加式更新開關。
setUpdateAutoPoup():更新提示開關。我們要自己處理更新回調,需要關閉自動彈出提示。
UmengUpdateListener():更新回調類。其中有一個回調方法onUpdateReturned(int upadteStatus, UpdateResponse upadteInfo),通過updateStatus來判斷是否有更新,upodateInfo則封裝了一些更新的內容,包括版本號碼,更新日誌等。
private static void showUpdateDialog(final UpdateResponse updateResponse, final Context context) { AlertDialog.Builder updateAlertDialog = new AlertDialog.Builder(context); updateAlertDialog.setIcon(R.drawable.icon_app); updateAlertDialog.setTitle("版本更新提示"); String showMessage = "最新版本:" + updateResponse.version + "\n" + "更新日誌:\n" + updateResponse.updateLog; updateAlertDialog.setMessage(showMessage); updateAlertDialog.setNegativeButton("立即升級", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { File file = UmengUpdateAgent.downloadedFile(context, updateResponse); if (null == file) { UmengUpdateAgent.startDownload(context, updateResponse); } else {// 已經下載完成的最新版APK,直接安裝 UmengUpdateAgent.startInstall(context, file); } } }); updateAlertDialog.setNeutralButton("忽略此版本", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { UmengUpdateAgent.ignoreUpdate(context, updateResponse); } }); updateAlertDialog.setPositiveButton("取消", null); if (!((Activity) context).isFinishing()) updateAlertDialog.show(); }
如果你需要顯示更新進度,在下載APK開始、進行、結束或者失敗的時候,作出相應的反應,就需要設定一下下載回調介面:
UmengUpdateAgent.setDownloadListener(new UmengDownloadListener(){ @Override public void OnDownloadStart() { Toast.makeText(mContext, "download start" , Toast.LENGTH_SHORT).show(); } @Override public void OnDownloadUpdate(int progress) { Toast.makeText(mContext, "download progress : " + progress + "%" , Toast.LENGTH_SHORT).show(); } @Override public void OnDownloadEnd(int result, String file) { Toast.makeText(mContext, "download file path : " + file , Toast.LENGTH_SHORT).show(); } });
手動更新.
在許多應用中的設定中都可以看到有“檢測新版本”等類似的功能。手動更新的行為與自動更新基本一致,不同點就是不管什麼網路狀況,無論使用者是否忽略該版本的更新,都會去檢查更新。
UmengUpdateAgent.setDefault();UmengUpdateAgent.setUpdateAutoPopup(false);UmengUpdateAgent.forceUpdate(MainActivity.this);UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() { @Override public void onUpdateReturned(int statusCode, UpdateResponse updateResponse) { Toast.makeText(MainActivity.this, statusCode + "", 1000).show(); if (statusCode == UpdateStatus.Yes && updateResponse != null) { showUpdateDialog(updateResponse); } }});
檢查出來有版本的話,怎麼樣操作就看你在回呼函數裡面怎麼寫了。與自動更新基本一樣。
靜默下載
應用情境:當使用者進入首頁之後,如果處於wifi下,後台檢測到更新的話,自動下載,下載完成之後,通知給使用者。
相信有不少應用就是這樣乾的。
進本設定與上面相同。
UmengUpdateAgent.silentUpdate(this);
總結
demo
歡迎大家支援,如有問題,請指正。
謝謝~~~
Android從零單排之自動跟新