Android應(yīng)用程序更新時(shí)的安裝與卸載(調(diào)用系統(tǒng)方法)

【聲明:】本文是作者(蘑菇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..

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脐往,隨后出現(xiàn)的幾起案子俱济,更是在濱河造成了極大的恐慌,老刑警劉巖钙勃,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛛碌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辖源,警方通過(guò)查閱死者的電腦和手機(jī)蔚携,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)克饶,“玉大人酝蜒,你說(shuō)我怎么就攤上這事》龋” “怎么了亡脑?”我有些...
    開(kāi)封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霉咨,道長(zhǎng)蛙紫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任途戒,我火速辦了婚禮坑傅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喷斋。我一直安慰自己唁毒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布星爪。 她就那樣靜靜地躺著浆西,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顽腾。 梳的紋絲不亂的頭發(fā)上室谚,一...
    開(kāi)封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音崔泵,去河邊找鬼秒赤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憎瘸,可吹牛的內(nèi)容都是我干的入篮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼幌甘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼潮售!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锅风,我...
    開(kāi)封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酥诽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后皱埠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肮帐,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年边器,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了训枢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忘巧,死狀恐怖恒界,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砚嘴,我是刑警寧澤十酣,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布涩拙,位于F島的核電站,受9級(jí)特大地震影響耸采,放射性物質(zhì)發(fā)生泄漏兴泥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一洋幻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翅娶,春花似錦文留、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜕提,卻和暖如春森书,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谎势。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工凛膏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脏榆。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓猖毫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親须喂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吁断,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容