Android 软件自动更新 (网络XML解析、以及本地xml软件版本两种解析方式)

XML放入网络空间---version.xml .url地址应该为正常***/*****.apk
<update>
 <version>5</version>
 <name>yuanbao</name>
 

<url>http://cdn.market.hiapk.com/data/upload//2012/06_27/13/yuanbao.co.

cc_134532.apk
 </url>
</update>
----------------主main
package gognzibai.co.cc;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //按钮更新
  Button updateBtn = (Button) findViewById

(R.id.btnUpdate);
  updateBtn.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    UpdateManager manager = new

UpdateManager(MainActivity.this);
    
    manager.checkUpdate();
   }
  });
 
 }
}


-----------------ParseXmlService.java
package gongzibai.co.cc;

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;

//解析xml
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);
  
  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;
 }
}

-------------更新管理.UpdateManager.java

package gongzibai.co.cc;

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.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
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;

 

public class UpdateManager {
 
 private static final int DOWNLOAD = 1;
 
 private static final int DOWNLOAD_FINISH = 2;
 
 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:
    //安装APK
    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();
  }
 }

 
 private boolean isUpdate() {
  
  int versionCode = getVersionCode(mContext);
  
  //本地的XML更新
  // InputStream inStream = ParseXmlService.class
  //
  // .getResourceAsStream("version.xml");
  // InputStream inStream = ParseXmlService.class
  // .getClassLoader()
  // .getResourceAsStream(
  // "version1.xml");
  
  //解析网络xml进行更新软件
  URL url = null;
  try {
   url = new URL(
     

"http://gongzibai.h001.sjsdidc.cn/version.xml");
  } catch (MalformedURLException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  HttpURLConnection conn = null;
  try {
   conn = (HttpURLConnection) url
     .openConnection();
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  conn.setConnectTimeout(5000);
  InputStream is = null;
  try {
   is = conn.getInputStream();
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

  
  ParseXmlService service = new ParseXmlService();
  try {
   mHashMap = service
     .parseXml(is);
  } catch (Exception e) {
   e.printStackTrace();
  }
  if (null != mHashMap) {
   int serviceCode = Integer
     .valueOf(mHashMap
       .get

("version"));
   
   if (serviceCode > versionCode) {
    return true;
   }
  }
  return false;
 }

 
 private int getVersionCode(
   Context context) {
  int versionCode = 0;
  try {
   
   versionCode = context
     .getPackageManager()
     .getPackageInfo(
       

"gongzibai.co.cc",
       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();
 }

 private void downloadApk() {
  
  new downloadApkThread().start();
 }

 private class downloadApkThread
   extends Thread {
  @Override
  public void run() {
   try {
    
    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();
  }
 };

 
 private void installApk() {
  File apkfile = new File(
    mSavePath,
    mHashMap.get("name"));
  if (!apkfile.exists()) {
   return;
  }
  
  Intent i = new Intent(
    Intent.ACTION_VIEW);
  i.setDataAndType(
    Uri.parse("file://"
      + apkfile
        

.toString()),
    "application/vnd.android.package-

archive");
  mContext.startActivity(i);
 }
}

 

------------------自动更新弹出

package gongzibai.co.cc;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends
  Activity {
 @Override
 public void onCreate(
   Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  new Handler().postDelayed(
    new Runnable() {

     @Override
     public void run() {
      // TODO Auto-generated method stub
      UpdateManager manager = new UpdateManager(
        MainActivity.this);

      manager.checkUpdate();

     }
    }, 5000);

 }

}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值