博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android之升级下载、安装apk
阅读量:4290 次
发布时间:2019-05-27

本文共 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:不断点续传(全新下载),第三个参数回                    HttpHandler
handler = 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/

你可能感兴趣的文章
Python模块——struct
查看>>
mysql中select * for update
查看>>
linux vmstat 1 ,watch , pmap -p,
查看>>
MYSQL 相关
查看>>
python 构建client 程序
查看>>
c++ 加载so动态库中的资源
查看>>
加解密 签名
查看>>
linux top 命令分析
查看>>
Linux vmstat命令详解
查看>>
linux pmap命令
查看>>
MySQL数据同步【双主热备】
查看>>
Mysql主从复制实践手册
查看>>
nginx配置正向代理支持HTTPS
查看>>
Perf -- Linux下的系统性能调优神器
查看>>
C++ 用libcurl库进行http通讯网络编程
查看>>
秒杀多线程第十篇 生产者消费者问题
查看>>
信号量与互斥锁
查看>>
linux 查看CPU个数,核数
查看>>
string 序列化
查看>>
va_start(),va_end()函数应用
查看>>