• Android apps应用检查更新代码


    JAVA代码:
    UpdateManager.java

    [java]
    < pre name="code" class="java">package com.iteye.update;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.HashMap;

    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.app.Dialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.Intent;
    import android.content.pm.PackageManager.NameNotFoundException;
    import android.net.Uri;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.ProgressBar;
    import android.widget.Toast;

    import com.iteye.androidtoast.R;

    public class UpdateManager
    {
    /* 下载中 */
    private static final int DOWNLOAD = 1;
    /* 下载结束 */
    private static final int DOWNLOAD_FINISH = 2;
    /* 保存解析的XML信息 */
    HashMap<String, String> mHashMap;
    /* 下载保存路径 */
    private String mSavePath;
    /* 记录进度条数量 */
    private int progress;
    /* 是否取消更新 */
    private boolean cancelUpdate = false;

    private Context mContext;
    /* 更新进度条 */
    private ProgressBar mProgress;
    private Dialog mDownloadDialog;

    private Handler mHandler = new Handler()
    {
    public void handleMessage(Message msg)
    {
    switch (msg.what)
    {
    // 正在下载
    case DOWNLOAD:
    // 设置进度条位置
    mProgress.setProgress(progress);
    break;
    case DOWNLOAD_FINISH:
    // 安装文件
    installApk();
    break;
    default:
    break;
    }
    };
    };

    public UpdateManager(Context context)
    {
    this.mContext = context;
    }

    /**
    * 检测软件更新
    */
    public void checkUpdate()
    {
    if (isUpdate())
    {
    // 显示提示对话框
    showNoticeDialog();
    } else
    {
    Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show();
    }
    }

    /**
    * 检查软件是否有更新版本
    *
    * @return
    */
    private boolean isUpdate()
    {
    // 获取当前软件版本
    int versionCode = getVersionCode(mContext);
    // 把version.xml放到网络上,然后获取文件信息
    //InputStream inStream = ParseXmlService.class.getClassLoader().getResourceAsStream("version.xml");
    // 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析
    ParseXmlService service = new ParseXmlService();
    try
    {
    String path = "http://192.168.1.146:8080/picweb/xml/version.xml"; //地址是服务器上version.xml链接地址
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setReadTimeout(5*1000);
    conn.setRequestMethod("GET");
    InputStream inStream = conn.getInputStream();
    mHashMap = service.parseXml(inStream);
    } catch (Exception e)
    {
    e.printStackTrace();
    }
    if (null != mHashMap)
    {
    int serviceCode = Integer.valueOf(mHashMap.get("version"));
    // 版本判断
    if (serviceCode > versionCode)
    {
    return true;
    }
    }
    return false;
    }

    /**
    * 获取软件版本号
    *
    * @param context
    * @return
    */
    private int getVersionCode(Context context)
    {
    int versionCode = 0;
    try
    {
    // 获取软件版本号,对应AndroidManifest.xml下android:versionCode
    versionCode = context.getPackageManager().getPackageInfo("com.iteye.androidtoast", 0).versionCode;
    } catch (NameNotFoundException e)
    {
    e.printStackTrace();
    }
    return versionCode;
    }

    /**
    * 显示软件更新对话框
    */
    private void showNoticeDialog()
    {
    // 构造对话框
    AlertDialog.Builder builder = new Builder(mContext);
    builder.setTitle(R.string.soft_update_title);
    builder.setMessage(R.string.soft_update_info);
    // 更新
    builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener()
    {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
    dialog.dismiss();
    // 显示下载对话框
    showDownloadDialog();
    }
    });
    // 稍后更新
    builder.setNegativeButton(R.string.soft_update_later, new OnClickListener()
    {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
    dialog.dismiss();
    }
    });
    Dialog noticeDialog = builder.create();
    noticeDialog.show();
    }

    /**
    * 显示软件下载对话框
    */
    private void showDownloadDialog()
    {
    // 构造软件下载对话框
    AlertDialog.Builder builder = new Builder(mContext);
    builder.setTitle(R.string.soft_updating);
    // 给下载对话框增加进度条
    final LayoutInflater inflater = LayoutInflater.from(mContext);
    View v = inflater.inflate(R.layout.softupdate_progress, null);
    mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
    builder.setView(v);
    // 取消更新
    builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener()
    {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
    dialog.dismiss();
    // 设置取消状态
    cancelUpdate = true;
    }
    });
    mDownloadDialog = builder.create();
    mDownloadDialog.show();
    // 现在文件
    downloadApk();
    }

    /**
    * 下载apk文件
    */
    private void downloadApk()
    {
    // 启动新线程下载软件
    new downloadApkThread().start();
    }

    /**
    * 下载文件线程
    */
    private class downloadApkThread extends Thread
    {
    @Override
    public void run()
    {
    try
    {
    // 判断SD卡是否存在,并且是否具有读写权限
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    {
    // 获得存储卡的路径
    String sdpath = Environment.getExternalStorageDirectory() + "/";
    mSavePath = sdpath + "download";
    URL url = new URL(mHashMap.get("url"));
    // 创建连接
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.connect();
    // 获取文件大小
    int length = conn.getContentLength();
    // 创建输入流
    InputStream is = conn.getInputStream();

    File file = new File(mSavePath);
    // 判断文件目录是否存在
    if (!file.exists())
    {
    file.mkdir();
    }
    File apkFile = new File(mSavePath, mHashMap.get("name"));
    FileOutputStream fos = new FileOutputStream(apkFile);
    int count = 0;
    // 缓存
    byte buf[] = new byte[1024];
    // 写入到文件中
    do
    {
    int numread = is.read(buf);
    count += numread;
    // 计算进度条位置
    progress = (int) (((float) count / length) * 100);
    // 更新进度
    mHandler.sendEmptyMessage(DOWNLOAD);
    if (numread <= 0)
    {
    // 下载完成
    mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
    break;
    }
    // 写入文件
    fos.write(buf, 0, numread);
    } while (!cancelUpdate);// 点击取消就停止下载.
    fos.close();
    is.close();
    }
    } catch (MalformedURLException e)
    {
    e.printStackTrace();
    } catch (IOException e)
    {
    e.printStackTrace();
    }
    // 取消下载对话框显示
    mDownloadDialog.dismiss();
    }
    };

    /**
    * 安装APK文件
    */
    private void installApk()
    {
    File apkfile = new File(mSavePath, mHashMap.get("name"));
    if (!apkfile.exists())
    {
    return;
    }
    // 通过Intent安装APK文件
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
    mContext.startActivity(i);
    }
    }</pre>
    < pre></pre>
    < pre name="code" class="java" style="background-color: rgb(255, 255, 255); "></pre>ParseXmlService.java
    < pre></pre>
    < pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><p></p><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java">package com.iteye.update;

    import java.io.InputStream;
    import java.util.HashMap;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;

    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;


    public class ParseXmlService
    {
    public HashMap<String, String> parseXml(InputStream inStream) throws Exception
    {
    HashMap<String, String> hashMap = new HashMap<String, String>();

    // 实例化一个文档构建器工厂
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    // 通过文档构建器工厂获取一个文档构建器
    DocumentBuilder builder = factory.newDocumentBuilder();
    // 通过文档通过文档构建器构建一个文档实例
    Document document = builder.parse(inStream);
    //获取XML文件根节点
    Element root = document.getDocumentElement();
    //获得所有子节点
    NodeList childNodes = root.getChildNodes();
    for (int j = 0; j < childNodes.getLength(); j++)
    {
    //遍历子节点
    Node childNode = (Node) childNodes.item(j);
    if (childNode.getNodeType() == Node.ELEMENT_NODE)
    {
    Element childElement = (Element) childNode;
    //版本号
    if ("version".equals(childElement.getNodeName()))
    {
    hashMap.put("version",childElement.getFirstChild().getNodeValue());
    }
    //软件名称
    else if (("name".equals(childElement.getNodeName())))
    {
    hashMap.put("name",childElement.getFirstChild().getNodeValue());
    }
    //下载地址
    else if (("url".equals(childElement.getNodeName())))
    {
    hashMap.put("url",childElement.getFirstChild().getNodeValue());
    }
    }
    }
    return hashMap;
    }
    }</pre>
    < pre></pre>
    XML代码:
    <p></p>
    < p>version.xml</p>
    < p></p>
    < pre name="code" class="html" style="background-color: rgb(255, 255, 255); "><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
    < update>
    <version>1</version>
    <name>baidu_xinwen_1.1.0</name>
    <url>http://gdown.baidu.com/data/wisegame/f98d235e39e29031/baiduxinwen.apk</url>
    < /update></pre><pre name="code" class="html" style="background-color: rgb(255, 255, 255); "></pre>测试代码:
    <p><br>
    < /p>
    < pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java"></pre><pre name="code" class="java">UpdateManager manager = new UpdateManager(MainTwoActivity.this);
    // 检查软件更新
    manager.checkUpdate();</pre>
    < p><br>
    < /p>
    < p>注:只需要把version.xml放到网上服务器去,更新版本时,到服务器把版本号和url修改一下就可以。</p>
    < p></p>
    < p></p>
    < span style="font-family:Arial,Helvetica,sans-serif"><span style="white-space:normal"></span></span>
    < pre></pre>
    < pre></pre>
    < pre></pre>
    < pre></pre>
    < pre></pre>

    < /pre></pre></pre></pre>

  • 相关阅读:
    60阶单群同构于A5的证明
    Riemann映射定理
    一个特殊情形的Mittag-Leffler分解
    一个重要的函数
    指数有限的子群存在一个右陪集代表元系,同时也是左陪集代表元系
    素数的平方阶群必为Abel群
    $mathscr{F}$类
    一个多项式问题
    Mittag-Leffler定理,Weierstrass因子分解定理和插值定理
    C -Concatenating Teams (字符串hash)
  • 原文地址:https://www.cnblogs.com/libao/p/2774846.html
Copyright © 2020-2023  润新知