安卓版本更新简单的Demo

本文主要简单讲解下安卓app如何进行版本更新

安卓版本更新不仅仅要在安卓端进行代码书写,还要后台人员的帮助!

首先将一个新的apk和一个txt文本给后台,让他放到先上去,可以用局域网测试,apk是你最新版的apk也就是你更新的时候会下载的这个apk,而txt文本则需要在里面加一段内容:

XXX&1.2.1&这里写点描述&http://192.168.0.11/php/versionAndroid/abc.apk 这里的XXX不需要管它,&是分隔符不可缺少,1.2.1是你的版本号,在后面是你对此次版本跟新的描述,最后的链接是可以下载apk的链接,即你给后台人员的那个apk,后台的这一切做好之后就看我们安卓端了! 


废话不多说,看代码:

public class GetServerUrl{
   static String url="http://192.168.0.11/php/versionAndroid";

   public static String getUrl() {
      return url;
   }
}
此处获取服务器IP地址我这里用的是局域网测试

然后再新建一个实体类
public class UpdateInfo
{
        private String version;
        private String description;
        private String url;
        
        public String getVersion()
        {
                return version;
        }
        public void setVersion(String version)
        {
                this.version = version;
        }
        public String getDescription()
        {
                return description;
        }
        public void setDescription(String description)
        {
                this.description = description;
        }
        public String getUrl()
        {
                return url;
        }
        public void setUrl(String url)
        {
                this.url = url;
        }
        
}
url、描述和版本号

然后我们通过读txt文本的内容来获取版本跟新需要一个工具类

public class UpdateInfoService {
   public UpdateInfoService(Context context) {
   }

   public UpdateInfo getUpDateInfo() throws Exception {
      String path = GetServerUrl.getUrl() + "/dashu.txt";
      StringBuffer sb = new StringBuffer();
      String line = null;
      BufferedReader reader = null;
      try {
         // 创建一个url对象
         URL url = new URL(path);
         // 通過url对象,创建一个HttpURLConnection对象(连接)
         HttpURLConnection urlConnection = (HttpURLConnection) url
               .openConnection();
         // 通过HttpURLConnection对象,得到InputStream
         reader = new BufferedReader(new InputStreamReader(
               urlConnection.getInputStream()));
         // 使用io流读取文件
         while ((line = reader.readLine()) != null) {
            sb.append(line);
         }
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (reader != null) {
               reader.close();
            }
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
      String info = sb.toString();
      UpdateInfo updateInfo = new UpdateInfo();
      updateInfo.setVersion(info.split("&")[1]);
      updateInfo.setDescription(info.split("&")[2]);
      updateInfo.setUrl(info.split("&")[3]);
      return updateInfo;
   }

}
准备工作都做好了,然后我的思路是在进入页面时,检测是否有新版本
代码如下:

public class MainActivity extends Activity {

    // 更新版本要用到的一些信息
    private UpdateInfo info;
    private ProgressDialog pBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toast.makeText(MainActivity.this, "正在检查版本更新..", Toast.LENGTH_SHORT).show();
        // 自动检查有没有新版本 如果有新版本就提示更新
        new Thread() {
            public void run() {
                try {
                    UpdateInfoService updateInfoService = new UpdateInfoService(
                            MainActivity.this);
                    info = updateInfoService.getUpDateInfo();
                    handler1.sendEmptyMessage(0);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }

    @SuppressLint("HandlerLeak")
    private Handler handler1 = new Handler() {
        public void handleMessage(Message msg) {
            // 如果有更新就提示
            if (isNeedUpdate()) {
                showUpdateDialog();
            }
        };
    };

    private void showUpdateDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setTitle("有新版本" + info.getVersion());
        builder.setMessage(info.getDescription());
        builder.setCancelable(false);

        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (Environment.getExternalStorageState().equals(
                        Environment.MEDIA_MOUNTED)) {
                    downFile(info.getUrl());
                } else {
                    Toast.makeText(MainActivity.this, "SD卡不可用,请插入SD",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
            }

        });
        builder.create().show();
    }

    private boolean isNeedUpdate() {

        String v = info.getVersion(); // 最新版本的版本号
        Log.i("update",v);
        Toast.makeText(MainActivity.this, v, Toast.LENGTH_SHORT).show();
        if (v.equals(getVersion())) {
            return false;
        } else {
            return true;
        }
    }

    // 获取当前版本的版本号
    private String getVersion() {
        try {
            PackageManager packageManager = getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    getPackageName(), 0);

            Log.d("TAK","packageInfo.versionName"+packageInfo.versionName);
            return packageInfo.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
            return "版本号未知";

        }
    }

    void downFile(final String url) {
        Log.d("TSK","url"+url);
        pBar = new ProgressDialog(MainActivity.this);    //进度条,在下载的时候实时更新进度,提高用户友好度
        pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pBar.setTitle("正在下载");
        pBar.setMessage("请稍候...");
        pBar.setProgress(0);
        pBar.show();
        new Thread(new Runnable() {
            @Override
            public void run() {


                //Xutils3联网获取数据
                RequestParams param  = new RequestParams(url);
                param.setSaveFilePath(Environment.getExternalStorageDirectory()+"/abc/abc.apk");
                x.http().get(param, new Callback.ProgressCallback<File>() {
                    @Override
                    public void onSuccess(File file) {

                        Log.d("TAG",file.toString());
                        down();
                    }

                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {

                    }

                    @Override
                    public void onCancelled(CancelledException cex) {

                    }

                    @Override
                    public void onFinished() {

                    }

                    @Override
                    public void onWaiting() {

                    }

                    @Override
                    public void onStarted() {

                    }

                    @Override
                    public void onLoading(long total, long current, boolean isDownloading) {
                        pBar.setMax((int) total);
                        pBar.setProgress((int) current);

                    }
                });




            }
        }).start();
    }

    void down() {
        handler1.post(new Runnable() {
            public void run() {
                pBar.cancel();
                update();
            }
        });
    }

    void update() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(new File(Environment
                        .getExternalStorageDirectory()+"/abc", "abc.apk")),
                "application/vnd.android.package-archive");
        startActivity(intent);
    }

}
我这里用的是Xutil3获取网络数据,当然你们也可以用OkHttp或者其它网络框架
项目地址:(http://download.csdn.net/detail/zhangzibin1992/9756861)

有不明白的可在底下留言


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值