編輯:關於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動態圖的全過程
Android App開發完了,自然希望錄個gif做個展示。視頻也可以做展示,但是需要上傳到優酷、土豆等等,而且本來就十幾秒的App演示操作過程,視頻網站的廣告就要一分鐘
東東手游安卓模擬器閃退解決教程
東東手游助手是款官方推出的安卓模擬器,在東東手游助手運行時出現閃退這種異常現象是因為什麼呢?怎麼解決東東手游助手閃退問題呢?先分析東東手游助手閃退原因:1.
Android-ViewPager的使用
Android-ViewPager的使用ViewPager是安卓App很常用的工具類,通常是用來設置界面導航,比如微信,QQ都是使用這種,還有就是新聞類App,很常見比如
基於facebook atc搭建企業級弱網絡模擬平台
背景為了提升產品在復雜網絡環境下的體驗,性能,所以搭建了一套模擬網絡的環境來提高效率,主要通過Ubuntu分享小范圍Ap,使用Facebook的開源項目ATC(argum