Android应用程序更新时的安装与卸载(调用系统方法)

【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在简书。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!


当服务器上有新版本的应用时,客户端程序发送https请求,服务器端在接受到请求以后,给客户端返回数据(json,xml),json数据从数据库中读取出来,读取数据拼接成json,语法规则如下:

服务器端json数据

{
"version_name": "2.0",
"version_code": 2,
"description": "最新版xxx,快来下载体验吧!",
"download_url": "http://10.0.2.2:8080/xx2.0.apk"
}

注意: 保存文本为 "UTF-8 无BOM" 格式

客户端通过获取本地的版本号,检测升级(本地版本号<小于服务器版本号,服务器有一个更高版本的应用),获取本地版本号代码如下:

获取版本信息

    //获取版本信息
    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 "";
    }

当服务器版本号大于本地版本的时候,则需要本地弹出是否更新的对话框,当点击更新的时候,下载服务器最新版本的apk.


  • 下载apk

    • 使用xutils框架进行下载

        // 下载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();
        //(下载地址,下载应用存放位置(sd卡),下载过程中方法的回调)
        httpUtils.download(
                mDownloadUrl, sdPath, 
                new RequestCallBack<File>() {
                    @Override
                    public void onSuccess(ResponseInfo<File> responseInfo) {
                        Log.i(tag, "下载成功");
                        //下载过后从服务端获取到的apk
                        File file = responseInfo.result;
                        //安装apk过程,android源码中找到apk安装过程,android系统在安装应用,开启一个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, "下载过程中");
                    }
                    @Override
                    public void onStart() {
                        super.onStart();
                        Log.i(tag, "下载开始");
                    }
                });
          }
      }
      

  • 卸载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的配置, 从而决定在跳转系统安装界面的Activity时应该传哪些参数.

// 安装apk
public void installApk(File file) {
    //通过隐式意图去开启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");*/
    //这一句话中,第一个参数是要安装的apk的路径,第二个参数是apk 
    // 所对应的类型。可以在tomcat的安装目录下的conf目录下的web.xml中找到
    intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
    //startActivity(intent);
    startActivityForResult(intent,0);
}

//接收后一个界面返回结果的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    enterHome();
    super.onActivityResult(requestCode, resultCode, data);
}

/**
 * 进入应用程序主界面
 */
public void enterHome() {
    //activity跳转
    Intent intent = new Intent(this,HomeActivity.class);
    startActivity(intent);
    finish();
}

安装失败

 在Android手机里不允许有两个应用程序有相同的包名;

 假设A应用的包名:com.xxx.xxA;
 A应用已经在系统中存在了。

 这个时候再去安装一个应用B ,他的包名也叫 con.xxx.xxA
 系统就会去检查这两应用的签名是否相同。如果相同,B会把A给覆盖安装掉;
 如果不相同 B安装失败;

 要想自动安装成功,必须保证应用程序不同版本的签名完成一样。
  • 签名

默认签名

直接在studio里运行项目是, 会采用默认签名debug.keystore. 查找方式: Window->Preference->Android->Build, 可以看到默认签名文件的路径, 默认是: C:\Users\tt\.android\debug.keystore

默认签名的特点: 
1. 不同电脑,默认签名文件都不一样
2. 有效期比较短, 默认是1年有效期
3. 有默认密码: android, 别名:androiddebugkey

正式签名

正式签名特点:
1. 发布应用市场时, 统一使用一个签名文件
2. 有效期比较长, 一般25年以上
3. 正式签名文件比较重要,需要开发者妥善保存签名文件和密码

使用正式签名文件,分别打包1.0和2.0, 安装运行1.0版本,测试升级是否成功

签名文件丢失后, 肿么办?

1. 让用户卸载旧版本, 重新在应用市场上下载最新版本, 会导致用户流失
2. 更换包名, 重新发布, 会出现两个xx, 运行新版xx, 卸载旧版本
3. 作为一名有经验的开发人员, 最好不要犯这种低级错误!

中午不睡,下午崩溃...it's truth..

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容