Android apk更新

原理图:


代码如下:

public class WelcomeActivity extends Activity {
    private static final int WHAT_START_MAIN = 1;//跳转到主页面
    private static final int WHAT_REQUEST_UPDATE_ERROR = 2;//请求更新错误
    private static final int WHAT_REQUEST_UPDATE_SUCCESS = 3;//请求更新成功
    private static final int DOWNLOAD_APK_FAIL = 4;//下载失败
    private static final int DOWNLOAD_APK_SUCCESS = 5;//下载成功
    //背景图片
    @BindView(R.id.iv_welcome_icon)
    ImageView ivWelcomeIcon;
    @BindView(R.id.rl_welcome)
    RelativeLayout rlWelcome;
    //版本名字
    @BindView(R.id.tv_welcome_version)
    TextView tvWelcomeVersion;
    //开始时间
    private long startTime;
    /**
     * 更新信息
     * public String version;//服务器的最新版本值
     * public String desc;//版本更新细节
     */
    private UpdateInfo updateInfo;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉窗口标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //隐藏顶部状态栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_welcome);
        ButterKnife.bind(this);

        //将当前的activity添加到ActivityManager中
        ActivityManager.getInstance().add(this);
        //提供启动动画
        setAnimation();

        //联网更新应用
        updateApkFile();

    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case WHAT_START_MAIN:
                    finish();
                    startActivity(new Intent(WelcomeActivity.this, MainActivity.class));

                    break;
                case WHAT_REQUEST_UPDATE_ERROR:
                    UIUtils.toast("联网下载数据失败", false);
                    toMain();
                    break;
                case WHAT_REQUEST_UPDATE_SUCCESS:
                    //获取当前应用版本信息
                    String verison = getVerison();
                    //更新页面显示的版本信息
                    tvWelcomeVersion.setText(verison);
                    if (verison.equals(updateInfo.version)) {//版本一致
                        UIUtils.toast("已是最新版本", false);
                    } else {
                        new AlertDialog.Builder(WelcomeActivity.this)
                                .setTitle("下载最新版本")
                                .setMessage(updateInfo.desc)
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        downloadApk();
                                    }
                                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                toMain();
                            }
                        })
                                .show();
                    }
                    break;
                case DOWNLOAD_APK_SUCCESS:
                    UIUtils.toast("下载应用数据成功", false);
                    dialog.dismiss();
                    installApk();//安装下载好的应用
                    finish();//结束当前的welcomeActivity的显示
                    break;
            }
        }
    };

    /**
     * 安装
     */
    private void installApk() {
        Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE");
        intent.setData(Uri.parse("file:" + apkFile));
        startActivity(intent);
    }

    /**
     * 更新apk文件
     */
    private void updateApkFile() {
        //判断手机是否联网
        boolean connect = isConnected();
        if (!connect) {//没有网络,进入主页面
            startTime = System.currentTimeMillis();
            toMain();
        } else {//有网络
            String updateUrl = AppNetConfig.UPDATE;//http://47.93.118.241:8081/P2PInvest/update.json
            //获得新版本信息
            AsyncHttpClient client = new AsyncHttpClient();
            client.post(updateUrl, new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(String content) {
                    //请求服务器得到最新版本的信息并封装为UpdateInfo对象
                    updateInfo = JSON.parseObject(content, UpdateInfo.class);
                    //请求更新成功
                    handler.sendEmptyMessage(WHAT_REQUEST_UPDATE_SUCCESS);
                }

                @Override
                public void onFailure(Throwable error, String content) {
                    //请求更新失败
                    handler.sendEmptyMessage(WHAT_REQUEST_UPDATE_ERROR);
                }
            });

        }
    }

    private ProgressDialog dialog;
    private File apkFile;

    /**
     * 开始下载
     */
    private void downloadApk() {
        //初始化水平进度条的dialog
        dialog = new ProgressDialog(this);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.show();
        File fileDir;
        //判断SD卡是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            fileDir = this.getExternalFilesDir("");
        } else {
            fileDir = this.getFilesDir();
        }
        apkFile = new File(fileDir, "update.apk");
        //启用一个分线程下载
        new Thread() {

            @Override
            public void run() {
                super.run();
                String path = "http://61.190.5.6:9000/huabang.apk";
                HttpURLConnection conn = null;
                InputStream is = null;
                FileOutputStream fos = null;
                try {
                    URL url = new URL(path);
                    conn = (HttpURLConnection) url.openConnection();

                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);
                    conn.connect();
                    if (conn.getResponseCode() == 200) {
                        dialog.setMax(conn.getContentLength());//设置dialog的最大值
                        is = conn.getInputStream();
                        fos = new FileOutputStream(apkFile);
                        byte[] b = new byte[1024];
                        int len = -1;
                        while ((len = is.read(b)) != -1) {
                            //更新dialog的进度
                            dialog.incrementProgressBy(len);
                            fos.write(b, 0, len);
                        }
                        handler.sendEmptyMessage(DOWNLOAD_APK_SUCCESS);
                    } else {
                        handler.sendEmptyMessage(DOWNLOAD_APK_FAIL);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (conn != null) {
                        conn.disconnect();
                    }
                    if (is != null) {
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fos != null) {
                        try {
                            fos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();
    }

    /**
     * 获取版本
     */
    public String getVerison() {
        String versionName = "未知版本";
        PackageManager manager = getPackageManager();
        try {
            PackageInfo packageInfo = manager.getPackageInfo(getPackageName(), 0);
            versionName = packageInfo.versionName;
            return versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionName;
    }


    /**
     * 3秒后进入主页面
     */

    private void toMain() {
        long currentTime = System.currentTimeMillis();
        //得到需要延迟的时间
        int delayTime = (int) (3000 - (currentTime - startTime));

        if (delayTime < 0) {
            delayTime = 0;
        }
        handler.sendEmptyMessageDelayed(WHAT_START_MAIN, delayTime);
    }


    /**
     * 判断是否有网
     */
    public boolean isConnected() {
        boolean connected = false;
        ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo != null) {
            connected = networkInfo.isConnected();
        }
        return connected;
    }

    /**
     * 启动动画
     */
    private void setAnimation() {
        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);//0:完全透明  1:完全不透明
        alphaAnimation.setDuration(2000);
        alphaAnimation.setInterpolator(new AccelerateInterpolator());//设置动画的变化率
        //启动动画
        rlWelcome.startAnimation(alphaAnimation);

    }

}
效果图如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值