【聲明:】本文是作者(蘑菇v5)原創(chuàng)记舆,版權(quán)歸作者 蘑菇v5所有,侵權(quán)必究呼巴。本文首發(fā)在簡(jiǎn)書泽腮。如若轉(zhuǎn)發(fā),請(qǐng)注明作者和來(lái)源地址衣赶!未經(jīng)授權(quán)诊赊,嚴(yán)禁私自轉(zhuǎn)載!
當(dāng)服務(wù)器上有新版本的應(yīng)用時(shí)屑埋,客戶端程序發(fā)送https請(qǐng)求豪筝,服務(wù)器端在接受到請(qǐng)求以后痰滋,給客戶端返回?cái)?shù)據(jù)(json摘能,xml)续崖,json數(shù)據(jù)從數(shù)據(jù)庫(kù)中讀取出來(lái),讀取數(shù)據(jù)拼接成json团搞,語(yǔ)法規(guī)則如下:
服務(wù)器端json數(shù)據(jù)
{
"version_name": "2.0",
"version_code": 2,
"description": "最新版xxx,快來(lái)下載體驗(yàn)吧!",
"download_url": "http://10.0.2.2:8080/xx2.0.apk"
}
注意: 保存文本為 "UTF-8 無(wú)BOM" 格式
客戶端通過(guò)獲取本地的版本號(hào)严望,檢測(cè)升級(jí)(本地版本號(hào)<小于服務(wù)器版本號(hào),服務(wù)器有一個(gè)更高版本的應(yīng)用)逻恐,獲取本地版本號(hào)代碼如下:
獲取版本信息
//獲取版本信息
private String getVersion() {
PackageManager pm = getPackageManager();
try {
PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
String versionName = info.versionName;
int versionCode = info.versionCode;
return versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return "";
}
當(dāng)服務(wù)器版本號(hào)大于本地版本的時(shí)候像吻,則需要本地彈出是否更新的對(duì)話框,當(dāng)點(diǎn)擊更新的時(shí)候复隆,下載服務(wù)器最新版本的apk.
-
下載apk
-
使用xutils框架進(jìn)行下載
// 下載apk protected void downloadApk() { //判斷SDcard是否掛載 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"xx.apk"; HttpUtils httpUtils = new HttpUtils(); //(下載地址,下載應(yīng)用存放位置(sd卡),下載過(guò)程中方法的回調(diào)) httpUtils.download( mDownloadUrl, sdPath, new RequestCallBack<File>() { @Override public void onSuccess(ResponseInfo<File> responseInfo) { Log.i(tag, "下載成功"); //下載過(guò)后從服務(wù)端獲取到的apk File file = responseInfo.result; //安裝apk過(guò)程,android源碼中找到apk安裝過(guò)程,android系統(tǒng)在安裝應(yīng)用,開(kāi)啟一個(gè)activity, installApk(file); } @Override public void onFailure(HttpException arg0, String arg1) { Log.i(tag, "下載失敗"); } @Override public void onLoading(long total, long current, boolean isUploading) { super.onLoading(total, current, isUploading); Log.i(tag, "下載過(guò)程中"); } @Override public void onStart() { super.onStart(); Log.i(tag, "下載開(kāi)始"); } }); } }
-
-
卸載apk
public void uninstall(View v){ Intent intent = new Intent(); intent.setAction(Intent.ACTION_DELETE); intent.setData(Uri.parse("package:com.njupt.htmlui1")); startActivity(intent); }
- 安裝apk
查看PackageInstaller源碼, 查看AndroidManifest.xml文件中Activity的配置, 從而決定在跳轉(zhuǎn)系統(tǒng)安裝界面的Activity時(shí)應(yīng)該傳哪些參數(shù).
// 安裝apk
public void installApk(File file) {
//通過(guò)隱式意圖去開(kāi)啟activity
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
/*intent.setData(Uri.fromFile(file));
intent.setType("application/vnd.android.package-archive");*/
//這一句話中,第一個(gè)參數(shù)是要安裝的apk的路徑,第二個(gè)參數(shù)是apk
// 所對(duì)應(yīng)的類型拨匆。可以在tomcat的安裝目錄下的conf目錄下的web.xml中找到
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
//startActivity(intent);
startActivityForResult(intent,0);
}
//接收后一個(gè)界面返回結(jié)果的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
enterHome();
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 進(jìn)入應(yīng)用程序主界面
*/
public void enterHome() {
//activity跳轉(zhuǎn)
Intent intent = new Intent(this,HomeActivity.class);
startActivity(intent);
finish();
}
安裝失敗
在Android手機(jī)里不允許有兩個(gè)應(yīng)用程序有相同的包名挽拂;
假設(shè)A應(yīng)用的包名:com.xxx.xxA;
A應(yīng)用已經(jīng)在系統(tǒng)中存在了惭每。
這個(gè)時(shí)候再去安裝一個(gè)應(yīng)用B ,他的包名也叫 con.xxx.xxA
系統(tǒng)就會(huì)去檢查這兩應(yīng)用的簽名是否相同亏栈。如果相同台腥,B會(huì)把A給覆蓋安裝掉;
如果不相同 B安裝失斎薇薄黎侈;
要想自動(dòng)安裝成功,必須保證應(yīng)用程序不同版本的簽名完成一樣闷游。
- 簽名
默認(rèn)簽名
直接在studio里運(yùn)行項(xiàng)目是, 會(huì)采用默認(rèn)簽名debug.keystore. 查找方式: Window->Preference->Android->Build, 可以看到默認(rèn)簽名文件的路徑, 默認(rèn)是: C:\Users\tt\.android\debug.keystore
默認(rèn)簽名的特點(diǎn):
1. 不同電腦,默認(rèn)簽名文件都不一樣
2. 有效期比較短, 默認(rèn)是1年有效期
3. 有默認(rèn)密碼: android, 別名:androiddebugkey
正式簽名
正式簽名特點(diǎn):
1. 發(fā)布應(yīng)用市場(chǎng)時(shí), 統(tǒng)一使用一個(gè)簽名文件
2. 有效期比較長(zhǎng), 一般25年以上
3. 正式簽名文件比較重要,需要開(kāi)發(fā)者妥善保存簽名文件和密碼
使用正式簽名文件,分別打包1.0和2.0, 安裝運(yùn)行1.0版本,測(cè)試升級(jí)是否成功
簽名文件丟失后, 腫么辦?
1. 讓用戶卸載舊版本, 重新在應(yīng)用市場(chǎng)上下載最新版本, 會(huì)導(dǎo)致用戶流失
2. 更換包名, 重新發(fā)布, 會(huì)出現(xiàn)兩個(gè)xx, 運(yùn)行新版xx, 卸載舊版本
3. 作為一名有經(jīng)驗(yàn)的開(kāi)發(fā)人員, 最好不要犯這種低級(jí)錯(cuò)誤!
中午不睡峻汉,下午崩潰...it's truth..