android自動更新軟體版本

來源:互聯網
上載者:User

   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 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.net.Uri;

  import android.os.Handler;

  import android.os.Message;

  import android.util.Log;

  import android.view.LayoutInflater;

  import android.view.View;

  import android.widget.ProgressBar;

  public class UpdateManager {

  private Context mContext;

  private final String updateMsg = "親,有新版本,要更新嗎!"; //下載訊息提示

  private Dialog noticeDialog; //下載提示對話方塊

  private Dialog downloadDialog; //下載進度對話方塊

  private ProgressBar mProgressBar; //進度條

  private Boolean interceptFlag = false; //標記使用者是否在下載過程中取消下載

  private Thread downloadApkThread = null; //下載線程

  private final String apkUrl = "http://www.xxx/xxx.apk"; //apk的URL地址

  private final String savePath = "/sdcard/UpdateDemo/"; //下載的apk存放的路徑

  private final String saveFileName = savePath + "xxx.apk"; //下載的apk檔案

  private int progress = 0; //下載進度

  private final int DOWNLOAD_ING = 1; //標記正在下載

  private final int DOWNLOAD_OVER = 2; //標記下載完成

  private final String TAG="版本更新";

  //日誌列印標籤

  private Handler mhandler = new Handler() { //更新UI的handler

  @Override

  public void handleMessage(Message msg) {

  super.handleMessage(msg);

  switch (msg.what) {

  case DOWNLOAD_ING:

  // 更新進度條

  mProgressBar.setProgress(progress);

  break;

  case DOWNLOAD_OVER:

  downloadDialog.dismiss();

  installApk();

  //安裝

  break;

  default:

  break;

  }

  }

  };

  /*

  * 構造方法

  */

  public UpdateManager(Context context) {

  this.mContext = context;

  }

  /*

  * 檢查是否有需要更新,具體比較版本xml

  */

  public void checkUpdate() {

  // 到伺服器檢查軟體是否有新版本

  //如果有則

  showNoticeDialog();

  }

  /*

  * 顯示版本更新對話方塊

  */

  private void showNoticeDialog() {

  AlertDialog.Builder builder = new Builder(mContext);

  builder.setTitle("版本更新");

  builder.setMessage(updateMsg);

  builder.setPositiveButton("更新", new OnClickListener() {

  public void onClick(DialogInterface dialog, int which) {

  noticeDialog.dismiss();

  showDownloadDialog();

  }

  });

  builder.setNegativeButton("以後再說", new OnClickListener() {

  public void onClick(DialogInterface dialog, int which) {

  noticeDialog.dismiss();

  }

  });

  noticeDialog = builder.create();

  noticeDialog.show();

  }

  /*

  * 彈出下載進度對話方塊

  */

  private void showDownloadDialog() {

  AlertDialog.Builder builder = new Builder(mContext);

  builder.setTitle("軟體更新");

  final LayoutInflater inflater = LayoutInflater.from(mContext);

  View v = inflater.inflate(R.layout.progress, null);

  mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);

  builder.setView(v);

  builder.setNegativeButton("取消", new OnClickListener() {

  public void onClick(DialogInterface dialog, int which) {

  downloadDialog.dismiss();

  interceptFlag = true;

  }

  });

  downloadDialog = builder.create();

  downloadDialog.show();

  downloadLatestVersionApk();

  }

  /*

  * 下載最新的apk檔案

  */

  private void downloadLatestVersionApk() {

  downloadApkThread = new Thread(downloadApkRunnable);

  downloadApkThread.start();

  }

  //匿名內部類,apk檔案下載線程

  private Runnable downloadApkRunnable = new Runnable() {

  public void run() {

  try {

  URL url = new URL(apkUrl);

  HttpURLConnection conn = (HttpURLConnection) url

  .openConnection();

  conn.setConnectTimeout(5*1000);

  conn.connect();

  int length = conn.getContentLength();

  Log.e(TAG, "總位元組數:"+length);

  InputStream is = conn.getInputStream();

  File file = new File(savePath);

  if (!file.exists()) {

  file.mkdir();

  }

  File apkFile = new File(saveFileName);

  FileOutputStream out = new FileOutputStream(apkFile);

  int count = 0;

  int readnum = 0;

  byte[] buffer = new byte[1024];

  do {

  readnum = is.read(buffer);

  count += readnum;

  progress = (int) (((float) count / length) * 100);

  Log.e(TAG, "下載進度"+progress);

  mhandler.sendEmptyMessage(DOWNLOAD_ING);

  if (readnum <= 0) {

  // 下載結束

  mhandler.sendEmptyMessage(DOWNLOAD_OVER);

  break;

  }

  out.write(buffer,0,readnum);

  } while (!interceptFlag);

  is.close();

  out.close();

  } catch (MalformedURLException e) {

  e.printStackTrace();

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  };

  /*

  * 安裝下載的apk檔案

  */

  private void installApk() {

  File file= new File(saveFileName);

  if(!file.exists()){

  return;

  }

  Intent intent= new Intent(Intent.ACTION_VIEW);

  intent.setDataAndType(Uri.parse("file://"+file.toString()), "application/vnd.android.package-archive");

  mContext.startActivity(intent);

  }

  }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.