Android开发中如何让应用程序自动更新

2014-12-02 13:43
分享到:
  在Android应用开发中,许多开发者都会遇到如何让应用程序自动更新的问题,也就是需要让应用程序自动发现服务器上的新版本然后提示更新,当用户点击确定后就下载新版本的应用程序,下载完毕后自动安装更新新程序。
    关于这个主要的流程是这样的:程序启动 --> 在适当的时候后台检查更新 --> 链接远程服务器 --> 获取服务器端新版本信息 --> 比对当前版本 --> 判断是否有更新,如果有有 --> 显示更新提示对话框并显示更新提示内容 --> 交与用户选择是否立即更新。
 
    这个功能的实现需要在服务器端放置一个xml文件,xml文件主要用来说明当前版本信息,包括版本号,发布时间,版本功能
 
介绍等信息。下面是一个例子:
 
<?xml version="1.0" encoding="utf-8"?> 
<info>
   <vision>1.0.0.1</vision>   
   <url>http://192.168.0.150:8080/appupt/</url>
   <description>新版本描述信息</description>
</info>
 
 
1.uptInfo实体类,这个实体类对应于服务器端的xml文件,当程序检测是否有新版本时,首先从服务器下载xml文件后,会将这个xml文件内的信息解析到这个实体类中,参考代码如下:
 
public class UptInfo { 
    private String version; // 版本号 
    private String url; // 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; 
    } 
}
 
2.解析xml代码的工具类(这个类主要将从服务器端下载的xml解析到uptInfo实体类中),参考代码如下:
 
public class ParseXmlUtils { 
    //解析xml文件
    public static UptInfo parseXml(InputStream in) { 
        UptInfo uptInfo = new UptInfo(); 
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder db = null; 
            db = dbf.newDocumentBuilder(); 
            Document doc = null; 
            doc = db.parse(in); 
            Element root = doc.getDocumentElement(); 
            NodeList resultNode = root.getElementsByTagName("info"); 
            for (int i = 0; i < resultNode.getLength(); i++) { 
                Element res = (Element) resultNode.item(i); 
                uptInfo.setVersion(res.getElementsByTagName("version") 
                        .item(0).getFirstChild().getNodeValue()); 
                uptInfo.setUrl(res.getElementsByTagName("url").item(0) 
                        .getFirstChild().getNodeValue()); 
                uptInfo.setDescription(res 
                        .getElementsByTagName("description").item(0) 
                        .getFirstChild().getNodeValue()); 
            } 
        return upInfo; 
    } 
}
 
3.VersionUtil类,这个类主要用来获取当前已安装的Android应用开发应用程序的版本信息,主要用来与服务器端的xml中的版本信息对比判断是否提示更新,参考代码如下:
 
public class VersionUtil { 
    //获取版本号 
    public static String getCurVersion(Context context) 
            throws NameNotFoundException { 
        // 获取PackageManager 实例 
        PackageManager packageManager = context.getPackageManager(); 
        // 获得context所属类的包名,0表示获取版本信息 
        PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); 
        return packageInfo.versionName; 
    } 
}
 
4.主程序代码:
 
public class AutoUptDemoActivity extends Activity { 
    private Button button; 
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        button = (Button) findViewById(R.id.check); 
        button.setOnClickListener(new OnClickListener() { 
            @Override
            public void onClick(View v) { 
                checkVersion(); 
            } 
        }); 
    } 
  
    //检查是否需要更新程序 
    private void checkVersion() throws NameNotFoundException { 
        UptInfo uptInfo = new UptInfo(); 
        URL url; 
        url = new URL(http://192.168.0.150:8080/update.xml); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        uptInfo = ParseXmlUtils.parseXml(connection.getInputStream()); 
        if (uptInfo.getVersion().equals(VersionUtil.getCurVersion(this))) { 
            Toast.makeText(this, "版本相同,不需要升级!", Toast.LENGTH_SHORT).show(); 
        } else { 
            showUpdateDialog(uptInfo); 
        } 
    } 
  
    private void showUpdateDialog(UptInfo uptInfo) { 
        AlertDialog alertDialog = new AlertDialog.Builder(this) 
                .setTitle("提示检测到新版本,确定升级吗?").setIcon(R.drawable.ask) 
                .setMessage(uptInfo.getDescription()) 
                .setPositiveButton("确定", new DialogInterface.OnClickListener() { 
                    @Override
                    public void onClick(DialogInterface dialog, int which) { 
                        dialog.cancel(); //此处下载新版程序文件并安装,本文已经很长,这里不再赘述
                    } 
                }) 
                .setNegativeButton("取消", new DialogInterface.OnClickListener() { 
                    @Override
                    public void onClick(DialogInterface dialog, int which) { 
                        dialog.cancel(); 
                    } 
                }).create(); 
        alertDialog.show(); 
    } 
}
 
Keywords:上海APP开发 网站地图 友情链接:大连口才培训 粉尘加湿机 南京地暖 深圳起重机 深圳食堂承包 盘锦商务礼品 影视配音 电子电器网 酒店餐具 深圳名片印刷 2be水环式真空泵 冷压端子 麦格官网 徒手整形培训
  • 需求咨询
  • 技术咨询
  • 运营咨询
  • 需求咨询点击咨询
  • 技术咨询点击咨询