本文共 8914 字,大约阅读时间需要 29 分钟。
public class MainActivity extends AppCompatActivity { private static final int JSON_ERROR = 3; private static final int ENTER_HOME = 0; private static final int ENTER_DIALOG = 1; private static final int URL_ERROR = 2; private static final int NET_ERROR = 4; private TextView tv; private String version; private String downloadUrl; private String desc;private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);// Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);// setSupportActionBar(toolbar); sp=getSharedPreferences("connfig",MODE_PRIVATE); tv = findViewById(R.id.tv_version); tv.setText("版本:1.1.1"); Boolean update=sp.getBoolean("update",false);//获取保存的是否自动更新的设置 if(update){ checkUpdate(); }else {//不检查更新,延迟两秒后进入主页面 handler.postDelayed(new Runnable() { @Override public void run() { enterhome(); } }, 2000); }//给activitymain设置动画 AlphaAnimation aa = new AlphaAnimation(0.3f, 1.0f); aa.setStartTime(1000); findViewById(R.id.main).startAnimation(aa); } //子线程请求网络数据后通过handlemessage发送数据,在主线程用handler更新UI private Handler handler = new Handler() { @SuppressLint("WrongConstant") @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case ENTER_HOME://进入主页面 enterhome(); break; case ENTER_DIALOG://显示对话框 showUpdateDialog(); enterhome(); break; case JSON_ERROR://json 解析出错 Toast.makeText(getApplicationContext(), "json解析错误", 0).show(); enterhome(); break; case URL_ERROR://url 出错 enterhome(); break; case NET_ERROR://网络出错 enterhome(); break; } } }; //显示dialog private void showUpdateDialog() { AlertDialog.Builder build = new AlertDialog.Builder(this);// build.setCancelable(false);//设置点返回按钮和dialog外不起作用,一般做强制升级的时候才用; //点击手机返回键或dialog外的activty时调用的监听方法 build.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { enterhome();//进入主页面 dialog.dismiss(); } }); build.setTitle("提示"); build.setMessage(desc); build.setPositiveButton("立即升级", new DialogInterface.OnClickListener() { @SuppressLint("WrongConstant") @Override public void onClick(DialogInterface dialog, int which) {//下载apk,并且替换 if (Environment.getExternalStorageDirectory().equals(Environment.MEDIA_MOUNTED)) {//sd卡存在//再libs文件夹中导入afinal框架 FinalHttp fh = new FinalHttp(); //调用download方法开始下载 //第一个参数这里是下载的路径( "/mnt/sdcard/testapk.apk", //这是保存到本地的路径),第二个参数 // true:断点续传 false:不断点续传(全新下载),第三个参数回 HttpHandlerhandler = fh.download(Environment.getExternalStorageDirectory().getAbsolutePath() + "/phonesafe02.apk", String.valueOf(true), new AjaxCallBack() { @Override public void onLoading(long count, long current) { tv.setText("下载进度:" + current + "/" + count); } public void onSuccess(File t) { tv.setText(t == null ? "null" : t.getAbsoluteFile().toString()); //下载好了就安装应用apk installapk(t); } //下载好了就安装应用apk private void installapk(File t) { Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.categary.DEFAULT"); intent.setDataAndType(Uri.fromFile(t),"application/vnd.android.package-archive"); startActivity(intent); } }); //调用stop()方法停止下载 handler.stop(); } else {sd卡不存在 Toast.makeText(getApplicationContext(), "请安装sd卡后再试", 0).show(); return; } } }); build.setNegativeButton("下次再说", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //取消对话框,进入主页面 dialog.dismiss(); ; enterhome(); } }); build.show(); } //进入主页面 private void enterhome() { Intent intent = new Intent(this, HomeActivity.class); startActivity(intent); //关闭当前的activity---销毁了 finish(); } private void checkUpdate() { new Thread(new Runnable() { @Override public void run() { long startTime = System.currentTimeMillis();//1970到现在的毫秒数 Message msg = Message.obtain();//给handler传数据用的 try { URL url = new URL(getString(R.string.uodateUrl)); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream();//联网成功获取数据 String result = Utils.readfromStream(is);//转换成string//json解析 try { JSONObject obj = new JSONObject(result); //得到服务器的信息 version = (String) obj.get("version"); downloadUrl = (String) obj.get("url"); desc = (String) obj.get("desc"); //版本比较 if (getVersionName().equals(version)) {//版本一样,不升级,直接进入主页 msg.what = ENTER_HOME; } else {//提示更新,弹出dialog msg.what = ENTER_DIALOG; } } catch (JSONException e) { e.printStackTrace(); msg.what = JSON_ERROR; } } } catch (MalformedURLException e) { e.printStackTrace(); msg.what = URL_ERROR; } catch (IOException e) { e.printStackTrace(); msg.what = NET_ERROR; } finally { long endTime = System.currentTimeMillis();//1970到现在的毫秒数 long dTime = endTime - startTime; if (dTime < 2000) { try { //睡两秒,加上请求网络的时间一共2秒 Thread.sleep(2000 - dTime); } catch (InterruptedException e) { e.printStackTrace(); } } handler.sendMessage(msg); } } }).start(); } //获取应用程序的版本名称 private String getVersionName() { PackageManager pm = getPackageManager();//用来管理手机的apk try { PackageInfo info = pm.getPackageInfo(getPackageName(), 0);//得到apk功能清单文件 return info.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return ""; } }}
/** * * Created by lambo on 2018/4/11. * 吧stream流转换成string */public class Utils extends Object { //吧流转换成string public static String readfromStream(InputStream is) throws IOException { ByteArrayOutputStream baos=new ByteArrayOutputStream(); byte[] buffer=new byte[1024];int len=-1;while((is.read(buffer))!=-1){baos.write(buffer,0,len);}is.close();String result=buffer.toString();baos.close(); return result; }}在APP/libs中导入afinal_0.5_bin.jar包才能用afinal框架
转载地址:http://otmgi.baihongyu.com/