Android实战系列(一)---版本更新

来源:互联网 发布:qq空间刷留言软件 编辑:程序博客网 时间:2024/05/29 09:57

1、在启动页面里,在启动登录页面的同时,使用handler延迟0.2发送一个更新的广播(确保登录页面启动起来了啥)
LauncherGuide.java

AbsUI.startUI(context, LoginUI.class); handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        EventBus.getDefault().post(new Stype(Constant.LOGIN_Urage));                    }                }, 200);

2、Constant.LOGIN_Urage,被Login.java注册了

Login{...onCreate(){EventBus.getDefault().register(this);}... @Subscribe    public void onEventMainThread(Stype ev) {    ...       if (ev.getMsg() == Constant.LOGIN_Urage) {            checkVersion();        }      ...    }}

如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行.继续往下看:版本更新的工具类。

UpgradeBean bean = new UpgradeBean();        bean.setTypeID("1");            callBackHandler=new AsyncCallBackHandler(ui,showText,isShowDialog,null) {            @Override            public void mySuccess(int arg0, Header[] arg1, String result) {                Log.e(TAG, "onPostExecute():result:" + result);                // 调用接口                if (adapter != null) {                    // 完成接口                    adapter.onQueryCompleted(result);                    // 设置新版本                    setNewVersion(adapter.getVersionNO());                    //设置文件大小                    setSize(adapter.getSize());                    // 远程下载地址                    setDownloadRemoteUri( adapter.getDownloadRemoteUri() );                    Log.i(TAG, "adapter.getVersionNO()"+adapter.getVersionNO());                    boolean bUpgrade = isUpgrade(appInfo.getVersionName()+"."+appInfo.getVersionCode(),adapter.getVersionNO());                    // 更新事件接口                    adapter.onUpgrade(bUpgrade, appInfo.getVersionName(),adapter.getVersionNO(), getDownloadRemoteUri(), getDownloadLocalPath(),getSize());                }            }            @Override            public void myFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) {                Toast.makeText(ui, "网络异常", Toast.LENGTH_SHORT).show();            }        };        try {            AsyncHttpUtil.post(context, queryUri, bean, "application/json", callBackHandler);        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }

实际上是调用后台的版本更新的接口,使用AsyncHttpUtil封装的一步http网络post请求。

UpgradeBean会传递apk类型后台

public class UpgradeBean {    private String typeID ;//APP类型1安卓2IOS    public String getTypeID() {        return typeID;    }    public void setTypeID(String typeID) {        this.typeID = typeID;    }}

Adapter是个接口

public interface Adapter {        // 请求完成        abstract void onQueryCompleted(String result);        // http错误        abstract void onHttpFailed(Error error, java.lang.Exception exception, int responseCode, byte[] out);        // 获取最新版本号        abstract String getVersionNO();        //文件大小        abstract String getSize();        // 更新事件        abstract void onUpgrade(boolean upgrade, String oldVersion, String newVersion, String downloadRemoteUri, String downloadLocalPath,String size);        // 获取下载地址        abstract String getDownloadRemoteUri();        void onHttpFailed(java.lang.Error error, Exception exception,                int responseCode, byte[] out);    }

重点关心于是否更新,更新的实现,先看下服务端返回的数据结构

public class UpgradeMessageBean {    private String msg;    private int statu;    private UpgradeMessage model;    public class UpgradeMessage{        private String VersionLink;         private String  VersionNo;//    V1.1.0.0    }
public void onUpgrade(boolean upgrade, String oldVersion, String newVersion, String downloadRemoteUri, String downloadLocalPath,String size) {                if (upgrade) {//比较手机和接口返回的版本                    UpgradeNotificationBean notificationBean = new UpgradeNotificationBean();                    notificationBean.setTitle(context.getResources().getString(R.string.app_name));                    notificationBean.setOldVersion(oldVersion);                    notificationBean.setNewVersion(newVersion);                    notificationBean.setDownloadRemoteUri(downloadRemoteUri);                    notificationBean.setDownloadLocalPath(downloadLocalPath);                    notificationBean.setSize(size);                    UpgradeDialog upgradeDialogF = new UpgradeDialog(ui);//这里的ui不能改为context,必须为界面                    upgradeDialogF.setTitle("版本更新");                    upgradeDialogF.setContent(context.getResources().getString(R.string.app_name)+"新版发布(v"+newVersion+")");                    upgradeDialogF.setTaskBean(taskBean);                    upgradeDialogF.setNotificationBean(notificationBean);                    if (!ui.isFinishing()) {                        upgradeDialogF.show();                    }else {                        Log.i(TAG, "ui.isFinishing()="+ui.isFinishing());                    }                }else{                }            }

upgradeDialogF对话框弹出后(版本不一致),有确定取消两个按钮

    btn_upgrade_sure.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (notificationBean != null) {                    if (new NetworkState(context).isConnected() == false) {                        Toast.makeText(context, "无网络连接", Toast.LENGTH_SHORT).show();                        return;                    }                    if (!UpgradeTaskUtil.isCanDownload) {                        Toast.makeText(context, "没有存储卡,不能下载新版本", Toast.LENGTH_SHORT).show();                        UpgradeDialog.this.dismiss();                        return;                    }                    // 下载并且更新应用                    UpgradeTask task = new UpgradeTask((android.support.v4.app.FragmentActivity)context);                    if (notificationBean != null) {                        task.setTitle( notificationBean.getTitle() );                        task.setDownloadRemoteUri(notificationBean.getDownloadRemoteUri());                        task.setDownloadLocalPath(notificationBean.getDownloadLocalPath());                        task.download();                    }                    // 关闭自身窗口                    UpgradeDialog.this.dismiss();                }else{                    Log.e(TAG, "notificationBean == null");                }            }        });        //下次再说        btn_upgrade_cancle.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EventBus.getDefault().post(new Stype(Constant.LOGIN_UI));                UpgradeDialog.this.dismiss();            }        });

取消的话会给LoginUI发个广播,说哥们不更新直接登录就好了。
确定下载的话
则:

    new Thread(){            public void run(){                try {                    URL url = new URL(downloadRemoteUri);                    HttpURLConnection connection = (HttpURLConnection)url.openConnection();             connection.setConnectTimeout(5*1000);                                   Message msg = Message.obtain();                    msg.arg1 = connection.getResponseCode();                    msg.what = MSG_RESPONDECODE;                    handler.sendMessage(msg);                } catch (Exception e) {                    Log.i(TAG, "url 不可用=="+downloadRemoteUri);                    handler.sendEmptyMessage(MSG_NO_FILE);                }            }        }.start();

如果url不可用(404)则发MSG_NO_FILE,可用则把网络请求的的返回code保存起来,同时发送MSG_RESPONDECODE广播,

if(msg.arg1==200){                downloadManager                    }

通过内置的DownloadManager下载。

总结:
1、在软件启动后发送版本更新的广播,设定soap请求的参数。
2、对返回的版本号、url进行核对,版本一致,不提示用户下载,版本不一致,弹框提示用户。
3、用户决定下载,如果url正确可用(httpUrlconnect),则用Android内置的DownloadManager下载,否则提示文件不存在。(ACTION_PACKAGE_REPLACED、ACTION_DOWNLOAD_COMPLETE、ACTION_PACKAGE_ADDED)可以监听

原创粉丝点击