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); } }效果图如下