MainActivity.xml
xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bwei.versionupdata.MainActivity"> android:padding="10dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25sp" android:id="@+id/tv_versionName" android:text="我是1.0版本" />
Api
public class Api { public static String URL="https://www.zhaoapi.cn/version/"; }
appservice
import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; /** * Created by lenovo on 2018/4/20. */ public interface AppService { @GET("getVersion") ObservablegetIBean(@Query("type") String type); }
Bean
public class IBean { /** * code : 0 * data : {"apkUrl":"https://www.zhaoapi.cn/version/101.apk","type":0,"vId":1,"versionCode":"101","versionName":"1.0.1"} * msg : 获取版本信息成功 */ private String code; private DataBean data; private String msg; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public static class DataBean { /** * apkUrl : https://www.zhaoapi.cn/version/101.apk * type : 0 * vId : 1 * versionCode : 101 * versionName : 1.0.1 */ private String apkUrl; private int type; private int vId; private String versionCode; private String versionName; public String getApkUrl() { return apkUrl; } public void setApkUrl(String apkUrl) { this.apkUrl = apkUrl; } public int getType() { return type; } public void setType(int type) { this.type = type; } public int getVId() { return vId; } public void setVId(int vId) { this.vId = vId; } public String getVersionCode() { return versionCode; } public void setVersionCode(String versionCode) { this.versionCode = versionCode; } public String getVersionName() { return versionName; } public void setVersionName(String versionName) { this.versionName = versionName; } } }
model
public class IModel { public interface OnListener{ void OnSucces(IBean iBean); } OnListener onListener; public void setOnListener(OnListener onListener){ this.onListener=onListener; } public void getModel(String type){ Retrofit retrofit=new Retrofit.Builder().baseUrl(Api.URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); AppService appService = retrofit.create(AppService.class); ObservableiBean = appService.getIBean(type); iBean.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer () { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(IBean iBean) { if(onListener!=null){ onListener.OnSucces(iBean); } } }); } }
presenter
public class IPresenter { IModel iModel; IView iView; public IPresenter(IView iView) { this.iView = iView; iModel=new IModel(); } public void getPresenter(String type){ iModel.getModel(type); iModel.setOnListener(new IModel.OnListener() { @Override public void OnSucces(IBean iBean) { iView.OnSucces(iBean); } }); } }
view
public interface IView { void OnSucces(IBean iBean); }
MainActivity
public class MainActivity extends AppCompatActivity implements IView { /** * 版本信息 */ private TextView mTvVersionName; private IBean.DataBean data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); IPresenter iPresenter = new IPresenter(this); iPresenter.getPresenter("2"); } @Override public void OnSucces(IBean iBean) { data = iBean.getData(); } private String getVersionName() throws Exception { //获取packagemanager的实例 PackageManager packageManager = getPackageManager(); //getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); Log.e("TAG", "版本号" + packInfo.versionCode); Log.e("TAG", "版本名" + packInfo.versionName); return packInfo.versionName; } private int getVersionCode() throws Exception { //获取packagemanager的实例 PackageManager packageManager = getPackageManager(); //getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); Log.e("TAG", "版本号" + packInfo.versionCode); Log.e("TAG", "版本名" + packInfo.versionName); return packInfo.versionCode; } private void initView() { mTvVersionName = (TextView) findViewById(R.id.tv_versionName); } public void checkVersion(View view) throws Exception { //如果检测本程序的版本号小于服务器的版本号,那么提示用户更新 if (getVersionCode() < Integer.valueOf(data.getVersionCode())) { showDialogUpdate();//弹出提示版本更新的对话框 } else { //否则吐司,说现在是最新的版本 Toast.makeText(this, "当前已经是最新的版本", Toast.LENGTH_SHORT).show(); } } private void showDialogUpdate() { // 这里的属性可以一直设置,因为每次设置后返回的是一个builder对象 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置提示框的标题 builder.setTitle("版本升级"). // 设置提示框的图标 setIcon(R.mipmap.ic_launcher). // 设置要显示的信息 setMessage("发现新版本!请及时更新"). // 设置确定按钮 setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //Toast.makeText(MainActivity.this, "选择确定哦", 0).show(); loadNewVersionProgress();//下载最新的版本程序 } }). // 设置取消按钮,null是什么都不做,并关闭对话框 setNegativeButton("取消", null); // 生产对话框 AlertDialog alertDialog = builder.create(); // 显示对话框 alertDialog.show(); } private void loadNewVersionProgress() { // final String uri="http://www.apk.anzhi.com/data3/apk/201703/14/4636d7fce23c9460587d602b9dc20714_88002100.apk"; final ProgressDialog pd; //进度条对话框 pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("正在下载更新"); pd.show(); //启动子线程下载任务 new Thread() { @Override public void run() { try { File file = getFileFromServer(data.getApkUrl(), pd); sleep(3000); installApk(file); pd.dismiss(); //结束掉进度条对话框 } catch (Exception e) { //下载apk失败 Toast.makeText(getApplicationContext(), "下载新版本失败", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } }.start(); } public static File getFileFromServer(String uri, ProgressDialog pd) throws Exception { //如果相等的话表示当前的sdcard挂载在手机上并且是可用的 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { URL url = new URL(uri); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); //获取到文件的大小 pd.setMax(conn.getContentLength()); InputStream is = conn.getInputStream(); long time = System.currentTimeMillis();//当前时间的毫秒数 File file = new File(Environment.getExternalStorageDirectory(), time + "updata.apk"); FileOutputStream fos = new FileOutputStream(file); BufferedInputStream bis = new BufferedInputStream(is); byte[] buffer = new byte[1024]; int len; int total = 0; while ((len = bis.read(buffer)) != -1) { fos.write(buffer, 0, len); total += len; //获取当前下载量 pd.setProgress(total); } fos.close(); bis.close(); is.close(); return file; } else { return null; } } protected void installApk(File file) { Intent intent = new Intent(); //执行动作 intent.setAction(Intent.ACTION_VIEW); //执行的数据类型 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); } }
权限
android:name="android.permission.INTERNET"/>
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>