Android 自动检测更新功能的实现

步骤:

1.检测当前版本的信息AndroidManifest.xml–>manifest–>android:versionCode。

2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

效果图:(暂缺)

获取当前程序的版本号:

[java] view plaincopy
/* 
* 获取当前程序的版本号 
*/ 
private String getVersionName() throws Exception{  
    //获取packagemanager的实例   
    PackageManager packageManager = getPackageManager();  
    //getPackageName()是你当前类的包名,0代表是获取版本信息  
    PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);  
    return packInfo.versionName;
}

获取服务器端的版本号:

[java] view plaincopy
/* 
 * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号) 
 */  
public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{  
    XmlPullParser  parser = Xml.newPullParser();    
    parser.setInput(is, "utf-8");//设置解析的数据源   
    int type = parser.getEventType();  
    UpdataInfo info = new UpdataInfo();//实体  
    while(type != XmlPullParser.END_DOCUMENT ){  
        switch (type) {  
        case XmlPullParser.START_TAG:  
            if("version".equals(parser.getName())){  
                info.setVersion(parser.nextText()); //获取版本号  
            }else if ("url".equals(parser.getName())){  
                info.setUrl(parser.nextText()); //获取要升级的APK文件  
            }else if ("description".equals(parser.getName())){  
                info.setDescription(parser.nextText()); //获取该文件的信息  
            }  
            break;  
        }  
        type = parser.next();  
    }  
    return info;  
} 

从服务器下载apk:

[java] view plaincopy
public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{  
    //如果相等的话表示当前的sdcard挂载在手机上并且是可用的  
    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
        URL url = new URL(path);  
        HttpURLConnection conn =  (HttpURLConnection) url.openConnection();  
        conn.setConnectTimeout(5000);  
        //获取到文件的大小   
        pd.setMax(conn.getContentLength());  
        InputStream is = conn.getInputStream();  
        File file = new File(Environment.getExternalStorageDirectory(), "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;  
    }  
}  

匹配、下载、自动安装:

[java] view plaincopy
/* 
 * 从服务器获取xml解析并进行比对版本号  
 */  
    public class CheckVersionTask implements Runnable{  
  public void run() {  
        try {  
            //从资源文件获取服务器 地址   
            String path = getResources().getString(R.string.serverurl);  
            //包装成url的对象   
            URL url = new URL(path);  
            HttpURLConnection conn =  (HttpURLConnection) url.openConnection();   
            conn.setConnectTimeout(5000);  
            InputStream is =conn.getInputStream();   
            info =  UpdataInfoParser.getUpdataInfo(is);  

            if(info.getVersion().equals(versionname)){  
                Log.i(TAG,"版本号相同无需升级");  
                LoginMain();  
            }else{  
                Log.i(TAG,"版本号不同 ,提示用户升级 ");  
                Message msg = new Message();  
                msg.what = UPDATA_CLIENT;  
                handler.sendMessage(msg);  
            }  
        } catch (Exception e) {  
            // 待处理   
            Message msg = new Message();  
            msg.what = GET_UNDATAINFO_ERROR;  
            handler.sendMessage(msg);  
            e.printStackTrace();  
        }   
    }  
}  

Handler handler = new Handler(){  

    @Override  
    public void handleMessage(Message msg) {  
        // TODO Auto-generated method stub  
        super.handleMessage(msg);  
        switch (msg.what) {  
        case UPDATA_CLIENT:  
            //对话框通知用户升级程序   
            showUpdataDialog();  
            break;  
        case GET_UNDATAINFO_ERROR:  
            //服务器超时   
            Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();  
            LoginMain();  
            break;    
        case DOWN_ERROR:  
            //下载apk失败  
            Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();  
            LoginMain();  
            break;    
        }  
    }  
    };
/* 
 *  
 * 弹出对话框通知用户更新程序  
 *  
 * 弹出对话框的步骤: 
 *  1.创建alertDialog的builder.   
 *  2.要给builder设置属性, 对话框的内容,样式,按钮 
 *  3.通过builder 创建一个对话框 
 *  4.对话框show()出来   
 */  
protected void showUpdataDialog() {  
    AlertDialog.Builder builer = new Builder(this) ;   
    builer.setTitle("版本升级");  
    builer.setMessage(info.getDescription());  
    //当点确定按钮时从服务器上下载 新的apk 然后安装   
    builer.setPositiveButton("确定", new OnClickListener() {  
    public void onClick(DialogInterface dialog, int which) {  
            Log.i(TAG,"下载apk,更新");  
            downLoadApk();  
        }     
    });  
    //当点取消按钮时进行登录  
    builer.setNegativeButton("取消", new OnClickListener() {  
        public void onClick(DialogInterface dialog, int which) {  
            // TODO Auto-generated method stub  
            LoginMain();  
        }  
    });  
    AlertDialog dialog = builer.create();  
    dialog.show();  
}  

/* 
 * 从服务器中下载APK 
 */  
protected void downLoadApk() {  
    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 = DownLoadManager.getFileFromServer(info.getUrl(), pd);  
                sleep(3000);  
                installApk(file);  
                pd.dismiss(); //结束掉进度条对话框  
            } catch (Exception e) {  
                Message msg = new Message();  
                msg.what = DOWN_ERROR;  
                handler.sendMessage(msg);  
                e.printStackTrace();  
            }  
        }}.start();  
}  

//安装apk   
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);  
}  

/* 
 * 进入程序的主界面 
 */  
private void LoginMain(){  
    Intent intent = new Intent(this,MainActivity.class);  
    startActivity(intent);  
    //结束掉当前的activity   
    this.finish();  
}  

UpdataInfo:

[java] view plaincopy
public class UpdataInfo {  
    private String version;  
    private String url;  
    private String description;  
    public String getVersion() {  
        return version;  
    }  
    public void setVersion(String version) {  
        this.version = version;  
    }  
    public String getUrl() {  
        return url;  
    }  
    public void setUrl(String url) {  
        this.url = url;  
    }  
    public String getDescription() {  
        return description;  
    }  
    public void setDescription(String description) {  
        this.description = description;  
    }  
}  

update.xml:

[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>  
<info>  
    <version>2.0</version>  
    <url>http://192.168.1.187:8080/mobilesafe.apk</url>  
    <description>检测到最新版本,请及时更新!</description>  
</info>  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值