編輯:關於Android編程
檢查更新並下載更新可以說是一個app必備的功能了.
既然是必備功能,往往需要考慮很多東西,如下:
1,更新方式:
一個軟件有更新了,如果是上線了新的功能或修復了某些bug,或者是服務端的接口變了等,需要強制用戶更新軟件,不然就退出應用,而如果只是進行性能的優化或者界面變化但是數據不變的更新,往往不需要強制更新,所以這就產生兩種更新需求:強制更新與非強制更新.
2,後台下載:
強制更新可能實現起來較為簡單,必須要求用戶下載完更新並安裝後才能使用,在技術含量上要求不是太高,而對於非強制更新方式,用戶可以選擇下載更新,並且要切換到後台進行下載,也就是說要使用到service,但是後台下載又會產生第3點要求.
3,界面展示:
在後台下載的應用,需要在界面上展示實時下載進度,對於這塊,很多應用都是選擇在通知欄上展示,而CheckUpdateLibrary庫也不例外,但是光展示實時下載進度還不夠,當應用下載完畢,還得需要進行安裝應用,而用戶可以選擇不安裝應用,但是當他想安裝的時候,你不能讓用戶再下載一遍吧,所以需要讓用戶有個地方直接點擊就可以安裝之前下載的應用,而CheckUpdateLibrary同樣選擇在通知欄展示一個不可刪除的通知,提示用戶已經下載完成,點擊就可以安裝.而另一方面,如果在軟件後台下載的過程中,由於不可預測原因,導致軟件下載失敗,你需要讓用戶知道軟件下載失敗了,對於這一點,CheckUpdateLibrary同樣是在通知欄展示一個通知,提示用戶軟件下載失敗了,而用戶可以點擊該通知,重新激活下載Service進行重新下載.
4,網絡狀態判斷:
可能用戶在檢查更新時用的是流量但是用戶自己不知道,在下載的時候可能會直接下載,所以從用戶的角度出發,在有更新的Dialog彈出來的時候,就需要讓用戶知道他當前的網絡環境是移動網絡環境還是WIFI網絡環境,從而用戶可以選擇是否使用當前網絡環境進行下載應用.
5,可移植性:
既然每個應用都需要檢查更新,下載更新功能,那麼就必須有超強的可移植性,我們不能在這個應用寫一份檢查更新代碼,然後其他應用需要的時候,再把這些代碼粘貼過來,這樣做會很容易出錯,並且很麻煩,而采用CheckUpdateLibrary,直接在Android Studio中一句話引入該庫就可以使用,so方便!!!so快捷!!!
而顯然,網絡上已經有一些關於檢查更新或下載更新的庫,所以CheckUpdateLibrary相比於其他庫有什麼優勢呢?
1,零耦合:CheckUpdateLibrary從檢查更新到下載更新全部采用HttpURLConnection,Dialog同樣自定義,沒有引入任何其他第三方庫,而其他庫要麼是用的第三方網絡請求框架,要麼用的是別人封裝好的dialog.所以開發者可能會吐槽,這只是一個單純的檢查更新和下載更新功能,我卻需要多引入很多第三方庫,這無形之中增加了我APK的體積,我很不爽!!!而用這個庫,開發者完全不用擔心這些.
2,體積小:基於第一點,所以CheckUpdateLibrary庫體積超小,只有10多kb,
3,兼容6.0:因為使用的是HttpURLConnection,所以6.0系統同樣適配
4,可擴展性:CheckUpdateLibrary內置了一個實體類CheckUpdateInfo,用來接收檢查更新時返回的json數據,當然前提得和服務端商定好,對接好字段.而如果不想使用內置實體,開發者完全可以自定義自己的實體類,但是必須保證自定義的實體類中包含newAppVersionCode字段,該字段在庫中用來判斷是否有更新,所以必須包含,不然會檢查不到是否有更新.目前CheckUpdateLibrary只支持實體類的擴展,Dialog還只能用它提供的.
5,其他功能:比如可以自定義apk文件的存儲路徑,文件名,後台下載時是否在通知欄顯示實時下載進度等.
那麼如何使用呢?
使用Android Studio的小伙伴可以在gradle中直接引用如下一句話:
compile 'com.qiangxi.checkupdatelibrary:checkupdatelibrary:1.0.2'
使用eclipse的小伙伴只能從github中下載library文件,然後引入到項目中使用了,
CheckUpdateLibrary的github地址如下:
https://github.com/qiangxi/CheckUpdateLibrary
在代碼中,只需要這樣做即可,代碼如下:
package com.qiangxi.checkupdatelibrarydemo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.qiangxi.checkupdatelibrary.bean.CheckUpdateInfo; import com.qiangxi.checkupdatelibrary.dialog.ForceUpdateDialog; import com.qiangxi.checkupdatelibrary.dialog.UpdateDialog; public class MainActivity extends AppCompatActivity { private CheckUpdateInfo mCheckUpdateInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); } private void initData() { //被注釋的代碼用來進行檢查更新,這裡為了方便,模擬一些假數據 // Q.checkUpdate("post", getVersionCode(), "checkUpdateUrl", new CheckUpdateCallback() { // @Override // public void onCheckUpdateSuccess(String result, boolean hasUpdate) { // //result:服務端返回的json // CheckUpdateInfo checkUpdateInfo = new Gson().fromJson(result, CheckUpdateInfo.class); // //有更新,顯示dialog等 // if (hasUpdate) { // //強制更新,這裡用0表示強制更新,實際情況中可與服務端商定什麼數字代表強制更新即可 // if (checkUpdateInfo.getIsForceUpdate() == 0) { // //show ForceUpdateDialog // } // //非強制更新 // else { // //show UpdateDialog // } // } else { // //無更新,提示已是最新版等 // } // } // // @Override // public void onCheckUpdateFailure(String failureMessage, int errorCode) { // //failureMessage:一般為try{}catch(){}捕獲的異常信息 // //errorCode:暫時沒什麼用 // } // }); //模擬一些假數據 mCheckUpdateInfo = new CheckUpdateInfo(); mCheckUpdateInfo.setAppName("android檢查更新庫") .setIsForceUpdate(1)//設置是否強制更新,該方法的參數只要和服務端商定好什麼數字代表強制更新即可 .setNewAppReleaseTime("2016-10-14 12:37")//軟件發布時間 .setNewAppSize(12.3f)//單位為M .setNewAppUrl("http://shouji.360tpcdn.com/160914/c5164dfbbf98a443f72f32da936e1379/com.tencent.mobileqq_410.apk") .setNewAppVersionCode(20)//新app的VersionCode .setNewAppVersionName("1.0.2") .setNewAppUpdateDesc("1,優化下載邏輯\n2,修復一些bug\n3,完全實現強制更新與非強制更新邏輯\n4,非強制更新狀態下進行下載,默認在後台進行下載\n5,當下載成功時,會在通知欄顯示一個通知,點擊該通知,進入安裝應用界面\n6,當下載失敗時,會在通知欄顯示一個通知,點擊該通知,會重新下載該應用\n7,當下載中,會在通知欄顯示實時下載進度,但前提要dialog.setShowProgress(true)."); } /** * 強制更新 */ public void forceUpdateDialogClick(View view) { mCheckUpdateInfo.setIsForceUpdate(0); if (mCheckUpdateInfo.getIsForceUpdate() == 0) { ForceUpdateDialog dialog = new ForceUpdateDialog(MainActivity.this); dialog.setAppSize(mCheckUpdateInfo.getNewAppSize()) .setDownloadUrl(mCheckUpdateInfo.getNewAppUrl()) .setTitle(mCheckUpdateInfo.getAppName() + "有更新啦") .setReleaseTime(mCheckUpdateInfo.getNewAppReleaseTime()) .setVersionName(mCheckUpdateInfo.getNewAppVersionName()) .setUpdateDesc(mCheckUpdateInfo.getNewAppUpdateDesc()) .setFileName("這是QQ.apk") .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/checkupdatelib").show(); } } /** * 非強制更新 */ public void UpdateDialogClick(View view) { mCheckUpdateInfo.setIsForceUpdate(1); if (mCheckUpdateInfo.getIsForceUpdate() == 1) { UpdateDialog dialog = new UpdateDialog(MainActivity.this); dialog.setAppSize(mCheckUpdateInfo.getNewAppSize()) .setDownloadUrl(mCheckUpdateInfo.getNewAppUrl()) .setTitle(mCheckUpdateInfo.getAppName() + "有更新啦") .setReleaseTime(mCheckUpdateInfo.getNewAppReleaseTime()) .setVersionName(mCheckUpdateInfo.getNewAppVersionName()) .setUpdateDesc(mCheckUpdateInfo.getNewAppUpdateDesc()) .setFileName("這是QQ.apk") .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/checkupdatelib") //該方法需設為true,才會在通知欄顯示下載進度,默認為false,即不顯示 //該方法只會控制下載進度的展示,當下載完成或下載失敗時展示的通知不受該方法影響 //即不管該方法是置為false還是true,當下載完成或下載失敗時都會在通知欄展示一個通知 .setShowProgress(true) .setIconResId(R.mipmap.ic_launcher) .setAppName(mCheckUpdateInfo.getAppName()).show(); } } /** * 獲取當前應用版本號 */ private int getVersionCode() { try { PackageManager packageManager = getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0); return packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return -1; } } }
非強制更新:
強制更新:
最後,再貼一遍CheckUpdateLibrary的github地址:
https://github.com/qiangxi/CheckUpdateLibrary
歡迎start或fork!
Android App開發完了,自然希望錄個gif做個展示。視頻也可以做展示,但是需要上傳到優酷、土豆等等,而且本來就十幾秒的App演示操作過程,視頻網站的廣告就要一分鐘
東東手游助手是款官方推出的安卓模擬器,在東東手游助手運行時出現閃退這種異常現象是因為什麼呢?怎麼解決東東手游助手閃退問題呢?先分析東東手游助手閃退原因:1.
Android-ViewPager的使用ViewPager是安卓App很常用的工具類,通常是用來設置界面導航,比如微信,QQ都是使用這種,還有就是新聞類App,很常見比如
背景為了提升產品在復雜網絡環境下的體驗,性能,所以搭建了一套模擬網絡的環境來提高效率,主要通過Ubuntu分享小范圍Ap,使用Facebook的開源項目ATC(argum