一行代码实现版本更新

来源:互联网 发布:怎么查看手机的ip端口 编辑:程序博客网 时间:2024/05/22 15:56

前言

每一个不停迭代的App都需要版本更新,这是刚需
版本更新可以强制或者半强制用户通过App内部更新,而不是通过应用市场

最终效果


在需要进行版本更新的位置调用下面的代码
context上下文为了显示弹窗或者通知栏
后面的boolean类型值 显示/不显示检查版本更新的toast
主要是在App刚打开时,检查到版本号与后台一致,那么就不需要更新APP
当然也不需要提示用户
但当用户在设置界面进行查看版本号时,版本号一致,也需要对用户进行提示

老实说,这边就是一个半封装的模板,拿来用来时很爽的

 new UpdateManager(context).checkUpdate(true);

基本过程

版本更新的几个步骤

Created with Raphaël 2.1.0开始获取版本信息当前为最新?结束下载新版APK, 覆盖安装原版本yesno

总结下来无外乎
调版本接口->弹更新提示窗->开启服务下载APK->安装Apk

编码

step1 创建一个版本更新管理类

public class UpdateManager  {    private Context mContext;    private ProgressDialog mDialog;    public UpdateManager(Context context) {        this.mContext = context;    }    /**     * 检测软件更新     * 这里通过自己的网络框架简单改写     * 获取后台版本更新接口     */    public void checkUpdate(final boolean isToast) {        String url = GET_VERSION;        OkHttpUtils                .get()                .url(url)                .build()                .execute(new UpDateMsgCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                    }                    @Override                    public void onResponse(UpdateMsgBean bean, int id) {                        if ("00".equals(bean.getCode())) {                            UpdateMsgBean.DataBean.VersionInfoBean info = bean.getData().getVersionInfo();                            if (DeviceUtil.getVersionCode(mContext) < info.getVersionCode()) {                                App.version = info.getVersionNo();                                showNoticeDialog(info.getVersionNo(), info.getContent());                                App.VERSION_URL = info.getUrl();                            } else {                                if (isToast) {                                    Toast.makeText(mContext, "已经是最新版本", Toast.LENGTH_SHORT).show();                                }                            }                        }                    }                });    }    /**     * 显示更新对话框     */    private void showNoticeDialog(String versionNo, String version_info) {        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);        builder.setTitle("");        builder.setMessage("版本号:\n" + versionNo + "\n\n更新提示:\n" + version_info);        builder.setCancelable(false);        builder.setPositiveButton("更新", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();                mContext.startService(new Intent(mContext, DownLoadService.class));            }        });        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                dialog.dismiss();            }        });        Dialog noticeDialog = builder.create();        noticeDialog.show();    }}

step2 后台服务 下载新版apk

public class DownLoadService extends Service {//目标文件存储的文件夹路径    private String destFileDir = Environment.getExternalStorageDirectory().getAbsolutePath() + File            .separator + Constant.PACKAGE_NAME;     //目标文件存储的文件名    private String destFileName = Constant.APK_NAME;    private Context mContext;    private int preProgress = 0;    private int NOTIFY_ID = 1000;    private NotificationCompat.Builder builder;    private NotificationManager notificationManager;    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        mContext = this;        loadFile();        return super.onStartCommand(intent, flags, startId);    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }//下载文件    private void loadFile() {        initNotification();/***这里也使用 自己的网络框架进行下载和进度监听*/        OkHttpUtils.get()                .url(App.VERSION_URL)                .build()                .execute(new FileCallBack(destFileDir, destFileName) {                    @Override                    public void onError(Call call, Exception e, int id) {                        LogUtils.error("下载失败");                        cancelNotification();                        stopSelf();                    }                    @Override                    public void inProgress(float progress, long total, int id) {                        super.inProgress(progress, total, id);                        updateNotification((long) (progress * 100));                        LogUtils.info(progress+"");                    }                    @Override                    public void onResponse(File file, int id) {                        LogUtils.info("下载完成");                        cancelNotification();                        installApk(file);                        stopSelf();                    }                });    }//安装软件    private void installApk(File file) {        Uri uri = Uri.fromFile(file);        Intent install = new Intent(Intent.ACTION_VIEW);        install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        install.setDataAndType(uri, "application/vnd.android.package-archive");        // 执行意图进行安装        mContext.startActivity(install);    } //初始化Notification通知    public void initNotification() {        builder = new NotificationCompat.Builder(mContext)                .setSmallIcon(R.mipmap.siji)                .setContentText("0%")                .setContentTitle("apk更新")                .setProgress(100, 0, false);        notificationManager = (NotificationManager) mContext.getSystemService(                Context.NOTIFICATION_SERVICE);        notificationManager.notify(NOTIFY_ID, builder.build());    } //更新通知    public void updateNotification(long progress) {        int currProgress = (int) progress;        if (preProgress < currProgress) {            builder.setContentText(progress + "%");            builder.setProgress(100, (int) progress, false);            notificationManager.notify(NOTIFY_ID, builder.build());        }        preProgress = (int) progress;    } //取消通知    public void cancelNotification() {        notificationManager.cancel(NOTIFY_ID);    }    @Override    public void onDestroy() {        super.onDestroy();    }}

最后 不要忘记注册权限 和配置service

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 猫总喜欢咬人怎么办 养的猫老是咬人怎么办 猫咪就喜欢咬人怎么办 孩子被螨虫咬了怎么办 蚊子叮了起包怎么办 儿童被蚊子咬了怎么办 人被毛毛虫咬了怎么办 蜇儿毛虫蜇了怎么办 被虫叮咬后奇痒怎么办 冬天腿干燥起皮怎么办 小孩把唇膏吃了怎么办 多肉上的灰掉了怎么办 来月经我纹眉了怎么办 公司跑路了工资怎么办 甘油三酯9点多怎么办 头发油而且掉发怎么办 洗头时头发掉的厉害怎么办 头发很油又掉发怎么办 头发好油又掉发怎么办 衣服泡久了发臭怎么办 泰国鼻贴凝固了怎么办 压缩包密码忘了怎么办 激素脸满脸痘痘怎么办 用激素药脸上肿怎么办 脸上长激素痘痘怎么办 剑三海鳗下架怎么办 剑三背包锁忘了怎么办 剑三不要的装备怎么办 剑三f键用不了怎么办 剑网3威望满了怎么办 平时要上班狗狗怎么办 上班的时候狗狗怎么办 剑三入门套扔了怎么办 魔域bb转世满了怎么办 无线网破解不开怎么办 360云盘停用了怎么办 知道财富值超了怎么办 炫舞登录不上去怎么办 炫舞浪漫爱封号怎么办 穿的拖鞋有臭味怎么办 宝宝穿鞋子老掉怎么办