Android應用App更新實例詳解
前言:現(xiàn)在一般的Android軟件都是需要不斷更新的,當你打開某個app的時候,如果有新的版本,它會提示你有新版本需要更新。該項目實現(xiàn)的就是這個功能。并且有強制更新和更新提示兩種方式,當有更新時,會彈出一個提示框,點擊下載,則在通知來創(chuàng)建一個進度條進行下載,點擊取消,則取消更新。
效果:

開發(fā)環(huán)境:AndroidStudio2.1.2+gradle-2.10
部分代碼:
public class UpdateVersionController {
private Context context;
//更新文件的實例
private AppUpdateInfo info;
//當前版本號
private int versionCode;
//提示用戶更新的dialog
private Dialog dialog;
//下載進度條
private ProgressDialog pd;
public static UpdateVersionController getInstance(Context context) {
return new UpdateVersionController(context);
}
public UpdateVersionController(Context context) {
this.context = context;
}
public void normalCheckUpdateInfo() {
//獲取版本號:這里的版本號在項目的build.gradle中是可以看到的,看復制過來的參數(shù)
/**
defaultConfig {
applicationId "com.zhh.test"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
*/
versionCode = getVerCode(context);//等于19
checkVersionTask();
}
public void forceCheckUpdateInfo() {//強制更新一般不用
versionCode = getVerCode(context);//等于19
info = new AppUpdateInfo();
info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
info.setVercode(2);//每次更新都靠它
info.setVername("2.0");//版本名字
info.setApkname("com.hellotext.1309171635.apk");
info.setAppname("Hello");
info.setForceUpp("yes");
info.setUppcontent("1. Hello啊喲更新了\n2. 英文的,界面很好看.\n3. 界面效果優(yōu)化");//更新內(nèi)容
updateApp();
}
/**
* 步驟一:獲取版本信息
*/
private void checkVersionTask() {
//網(wǎng)絡加載獲取app新版版本信息
//這里不做請求直接賦值
info = new AppUpdateInfo();
info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/"+
"com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
info.setVercode(2);//每次更新都靠它
info.setVername("2.0");//版本名字
info.setApkname("com.hellotext.1309171635.apk");
info.setAppname("Hello");
info.setForceUpp("no");
info.setUppcontent("1. Hello啊喲更新了\n2. 英文的,界面很好看.\n3. 界面效果優(yōu)化");//更新內(nèi)容
updateApp();
}
private void updateApp() {
if (null != info && info.getVercode() > versionCode) {//20>19可更新
showUpdataDialog();
} else {
Toast.makeText(context, "已經(jīng)是最新版本啦~", Toast.LENGTH_SHORT).show();
}
}
private Button cancelBtn;
/**
* 步驟二:彈出對話框提示用戶更新
*/
protected void showUpdataDialog() {
dialog = new Dialog(context, android.R.style.Theme_Dialog);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.setContentView(R.layout.activity_updater);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
((TextView) dialog.findViewById(R.id.content)).setText(info.getUppcontent());
cancelBtn = (Button) dialog.findViewById(R.id.cancel);
cancelBtn.setVisibility("yes".equals(info.getForceUpp()) ? View.GONE : View.VISIBLE);
// 取消更新
cancelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
// 確認更新
dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
downLoadApk();
}
});
dialog.findViewById(R.id.market).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=Hello"));
context.startActivity(intent);
}
});
dialog.show();
}
/**
* 步驟三:下載文件
*/
private void downLoadApk() {
// 進度條對話框
pd = new ProgressDialog(context);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("下載中...");
pd.setCanceledOnTouchOutside(false);
pd.setCancelable(false);
// 監(jiān)聽返回鍵--防止下載的時候點擊返回
pd.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
Toast.makeText(context, "正在下載請稍后", Toast.LENGTH_SHORT).show();
return true;
} else {
return false;
}
}
});
// Sdcard不可用
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(context, "SD卡不可用~", Toast.LENGTH_SHORT).show();
} else {
pd.show();
//下載的子線程
new Thread() {
@Override
public void run() {
try {
// 在子線程中下載APK文件
File file = getFileFromServer(info.getUrl(), pd);
sleep(1000);
// 安裝APK文件
installApk(file);
pd.dismiss(); // 結(jié)束掉進度條對話框
} catch (Exception e) {
Toast.makeText(context, "文件下載失敗了~", Toast.LENGTH_SHORT).show();
pd.dismiss();
e.printStackTrace();
}
}
}.start();
}
}
/**
* 從服務器下載apk
*/
public File getFileFromServer(String path, ProgressDialog pd) throws Exception {
// 如果相等的話表示當前的sdcard掛載在手機上并且是可用的
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
// 獲取到文件的大小
pd.setMax(conn.getContentLength() / 1024);
InputStream is = conn.getInputStream();
File file = new File(Environment.getExternalStorageDirectory().getPath()
+ "/blibao/merchant", "i_blibao_shop.apk");
//判斷文件夾是否被創(chuàng)建
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len;
int total = 0;
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
total += len;
// 獲取當前下載量
pd.setProgress(total / 1024);
}
fos.close();
bis.close();
is.close();
return file;
} else {
return null;
}
}
/**
* 安裝apk
*/
protected void installApk(File file) {
Intent intent = new Intent();
// 執(zhí)行動作
intent.setAction(Intent.ACTION_VIEW);
// 執(zhí)行的數(shù)據(jù)類型
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
* 獲取版本名
*/
public static String getVerName(Context context) {
String verName = "";
try {
// 獲取packagemanager的實例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你當前類的包名,0代表是獲取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(
context.getPackageName(), 0);
verName = packInfo.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return verName;
}
/**
* 獲取版本號
*/
public static int getVerCode(Context context) {
int verCode = -1;
try {
// 獲取packagemanager的實例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你當前類的包名,0代表是獲取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(
context.getPackageName(), 0);
verCode = packInfo.versionCode;
} catch (Exception e) {
e.printStackTrace();
}
return verCode;
}
}
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Android開發(fā)之MediaPlayer多媒體(音頻,視頻)播放工具類
這篇文章主要介紹了Android開發(fā)之MediaPlayer多媒體(音頻,視頻)播放工具類,涉及Android針對音頻文件的讀取、播放、暫停、繼續(xù)等操作實現(xiàn)技巧,需要的朋友可以參考下2017-12-12
Android同步屏障機制sync barrier實例應用詳解
這篇文章主要介紹了Android同步屏障機制sync barrier實例應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-02-02
Android 使用Vitamio打造自己的萬能播放器(5)——在線播放(播放優(yōu)酷視頻)
本文主要介紹Android Vitamio的使用,這里給大家提供效果圖和代碼實例,來說明Vitamio組件播放網(wǎng)絡視頻,有需要的小伙伴可以參考下2016-07-07
Android實現(xiàn)簡單音樂播放器(MediaPlayer)
這篇文章主要為大家詳細介紹了Android實現(xiàn)簡單音樂播放器MediaPlayer的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

