Android应用手写自动更新以及强制更新

通过包名查找进入手机自带应用市场下载页

最近因为友盟提供的自动更新功能要下架了,于是乎自己查资料写了一个通过应用市场强制升级的功能。第一次写博客,感觉有点方,哈哈,重在知识积累,分享大众。言归正传,我把操作步骤以及重要代码贴出来希望对大家有用。

  • 获取版本信息
  • 运行MainActivity进行版本检测
  • 更新方案

> 首先进行从APP的application获取版本信息(本地版本号以及服务器版本号)

主要代码如下

首先新建一个类存放本地版本号以及服务器版本号,方便调用(若是直接从服务器下载APK,也可配置一个存放路径),直接贴代码:

public class Config {

    //版本信息
    public static int localVersion = 0;
    public static int serverVersion = 0;
    /* 下载包安装路径 */
    public static final String savePath = "/sdcard/test/";

    public static final String saveFileName = savePath + "test.apk";
}

这里是我在我的全局application的oncreate方法中定义的一个版本检测方法,如下:

public void initGlobal() {
        try {
            Config.localVersion = getPackageManager().getPackageInfo(
                    getPackageName(), 0).versionCode; // 设置本地版本号
            HttpRequest.VersionUpdate(mHandler, 1, getApplicationContext());//获取服务器版本号
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

第二步的思路就是我们希望一旦运行APP,进入到MainActivity中会进行一个版本对比,之后发现新版本弹出一个对话框提示我们升级(也分为强制升级以及自动更新,这个视情况而定),直接上代码:

/**
     * 检查更新版本
     */
    public void checkVersion() {//此方法在MainActivity的oncreate方法中执行
        if (Config.localVersion < Config.serverVersion) {
            Log.i("hgncxzy", "==============================");
            // 发现新版本,提示用户更新
            Intent intent = new Intent(MainActivity.this, DownloadAPKActivity.class);
            startActivity(intent);//弹出升级对话框,我这里直接弹出一个Dialog样式的Activity
        } else {
            // 清理工作,略去
            // cheanUpdateFile()
        }
    }

最后就是我的实现方案,跳转到应用市场让用户自行下载,也可以直接从服务器下载APK,但是因为公司服务器没完全搭建起来,成本较大,于是乎今天着重讲解跳转到手机自带应用市场下载页面,也就是上一步跳转的DownloadAPKActivity,“确认升级”按钮点击事件代码如下:

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.begin:
                Uri uriObj;
                Intent appStartIntent = new Intent(Intent.ACTION_VIEW);
                    uriObj = Uri.parse("market://details?id=你的包名");//从手机自带市场搜索你的APP包名
                try{
                    appStartIntent.setData(uriObj);
                    startActivity(appStartIntent);//搜到包名之后会直接跳转到相应市场你的APP下载页面,如有多个手机市场,之前会让你选择市场(很人性化)
                }catch (ActivityNotFoundException e){
                    uriObj = Uri.parse("http://a.app.qq.com/o/simple.jsp?pkgname=你的包名");//捕获异常,手机没有市场的情况下跳转到应用宝下载页面
                    appStartIntent.setData(uriObj);
                    startActivity(appStartIntent);
                }
                break;
            default:
                break;
        }
    }

附录,还有同学所在公司服务器比较牛逼点的可以直接从服务器下载APK的,我这里也提供一个下载方案,可以进行版本检查之后在MainActivity中调用此类的异步下载方法,仅供参考,亲测有效:

public class DownloadAPK {

    private static final String TAG = "DownloadAPK";
    private static final boolean DEBUG = true;

    private static DownloadAPK mInstance;

    private ProgressDialog downloadProDialog;
    private String appname = "名字.apk";

    public DownloadAPK(){}

    public static DownloadAPK getInstance(){
        if(mInstance == null){
            mInstance = new DownloadAPK();
        }
        return mInstance;
    }

    public void download(final Context context){//下载异步线程
        if (DEBUG) Log.i(TAG, "start downloadApkFile");
        downloadProgress(context);
        new Download(context).execute();
    }

    public class Download extends AsyncTask<Void, Integer, Void> {

        private Context mContext;

        public Download(Context context){
            mContext = context;
        }

        @Override
        protected Void doInBackground(Void... params) {
            String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() +"/"+ appname;

            String serverFilePath = "http://softfile.3g.qq.com:8080/msoft/179/1105/10753/MobileQQ1.0(Android)_Build0198.apk";//这里我模拟下载一个qq老版本APK,相当于从服务器获取
            try {
                URL serverURL = new URL(serverFilePath);
                HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
                BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
                File apkfile = new File(savePath);
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile));

                int n;
                byte[] buffer = new byte[1024];
                while((n=bis.read(buffer, 0, buffer.length))!=-1){
                    bos.write(buffer, 0, n);
                }
                bis.close();
                bos.close();
                connect.disconnect();
            } catch (Exception e) {
                e.printStackTrace();
                if (DEBUG) Log.e(TAG, "downloadFile exception !" + e);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            install(mContext);
            downloadProDialog.dismiss();
        }
    }

    public void downloadProgress(Context context){//自己定义的一个下载的进度条
        downloadProDialog = new ProgressDialog(context);
        downloadProDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        downloadProDialog.setTitle("正在下载");
        downloadProDialog.setMessage("下载中,请等待...");
        downloadProDialog.setMax(100);
        downloadProDialog.setProgress(0);
        downloadProDialog.setSecondaryProgress(0);
        downloadProDialog.setIndeterminate(false);
        downloadProDialog.setCancelable(false);
        downloadProDialog.show();
    }

    private void install(Context context){
        String fileName = Environment.getExternalStorageDirectory() +"/"+ appname;
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
        context.startActivity(intent);
    }
}

温馨提示:这是我的第一篇博客,发现只要懂得分享积累才能不断的提升自己,之后我会把我在项目中遇到的一些坑分享出来,一方面提升自我,其二也帮助其他奋斗在Android事业上的艰苦大众。然后,大家有什么问题欢迎前来留言骚扰,最后,祝大家事业顺心,每天进步。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值