<button id="u2w23"></button>

<tbody id="u2w23"><track id="u2w23"></track></tbody><dd id="u2w23"><track id="u2w23"></track></dd><button id="u2w23"><acronym id="u2w23"></acronym></button> <tbody id="u2w23"><noscript id="u2w23"></noscript></tbody>

  • <button id="u2w23"></button><li id="u2w23"><acronym id="u2w23"><cite id="u2w23"></cite></acronym></li>

  • ?

    Android應用升級及更新模塊實現

    作者:達內 更新時間:2014-06-16 10:04 來源:未知 點擊:
    達內android教程之Android應用的自動升級、更新模塊的實現。

      達內android教程:Android應用的自動升級、更新模塊的實現

      我們看到很多Android應用都具有自動更新功能,用戶一鍵就可以完成軟件的升級更新。得益于Android系統的軟件包管理和安裝機制,這一功能實現起來相當簡單,下面我們就來實踐一下。首先給出界面效果:

      1. 準備知識

      在AndroidManifest.xml里定義了每個Android apk的版本標識:

      package="com.myapp"

      android:versionCode="1"

      android:versionName="1.0.0">

      復制代碼

      其中,android:versionCode和android:versionName兩個字段分別表示版本代碼,版本名稱。versionCode是整型數字,versionName是字符串。由于version是給用戶看的,不太容易比較大小,升級檢查時,可以以檢查versionCode為主,方便比較出版本的前后大小。

      那么,在應用中如何讀取AndroidManifest.xml中的versionCode和versionName呢?可以使用PackageManager的API,參考以下代碼:

      public static int getVerCode(Context context) {

      int verCode = -1;

      try {

      verCode = context.getPackageManager().getPackageInfo(

      "com.myapp", 0).versionCode;

      } catch (NameNotFoundException e) {

      Log.e(TAG, e.getMessage());

      }

      return verCode;

      }

      public static String getVerName(Context context) {

      String verName = "";

      try {

      verName = context.getPackageManager().getPackageInfo(

      "com.myapp", 0).versionName;

      } catch (NameNotFoundException e) {

      Log.e(TAG, e.getMessage());

      }

      return verName;

      }

      復制代碼

      或者在AndroidManifest中將android:versionName="1.2.0"寫成android:versionName="@string/app_versionName",然后在values/strings.xml中添加對應字符串,這樣實現之后,就可以使用如下代碼獲得版本名稱:

      public static String getVerName(Context context) {

      String verName = context.getResources()

      .getText(R.string.app_versionName).toString();

      return verName;

      }

      復制代碼

      同理,apk的應用名稱可以這樣獲得:

      public static String getAppName(Context context) {

      String verName = context.getResources()

      .getText(R.string.app_name).toString();

      return verName;

      }

      復制代碼

      2. 流程框架

      3. 版本檢查

      在服務端放置最新版本的apk文件,如:http://localhost/myapp/myapp.apk

      同時,在服務端放置對應此apk的版本信息調用接口或者文件,如:http://localhost/myapp/ver.json

      ver.json中的內容為:

      [{"appname":"jtapp12","apkname":"jtapp-12-updateapksamples.apk","verName":1.0.1,"verCode":2}]

      復制代碼

      然后,在手機客戶端上進行版本讀取和檢查:

      private boolean getServerVer () {

      try {

      String verjson = NetworkTool.getContent(Config.UPDATE_SERVER

      + Config.UPDATE_VERJSON);

      JSONArray array = new JSONArray(verjson);

      if (array.length() > 0) {

      JSONObject obj = array.getJSONObject(0);

      try {

      newVerCode = Integer.parseInt(obj.getString("verCode"));

      newVerName = obj.getString("verName");

      } catch (Exception e) {

      newVerCode = -1;

      newVerName = "";

      return false;

      }

      }

      } catch (Exception e) {

      Log.e(TAG, e.getMessage());

      return false;

      }

      return true;

      }

      復制代碼

      比較服務器和客戶端的版本,并進行更新操作。

      if (getServerVerCode()) {

      int vercode = Config.getVerCode(this); // 用到前面第一節寫的方法

      if (newVerCode > vercode) {

      doNewVersionUpdate(); // 更新新版本

      } else {

      notNewVersionShow(); // 提示當前為最新版本

      }

      }

      復制代碼

      詳細方法:

      private void notNewVersionShow() {

      int verCode = Config.getVerCode(this);

      String verName = Config.getVerName(this);

      StringBuffer sb = new StringBuffer();

      sb.append("當前版本:");

      sb.append(verName);

      sb.append(" Code:");

      sb.append(verCode);

      sb.append(",/n已是最新版,無需更新!");

      Dialog dialog = new AlertDialog.Builder(Update.this).setTitle("軟件更新")

      .setMessage(sb.toString())// 設置內容

      .setPositiveButton("確定",// 設置確定按鈕

      new DialogInterface.OnClickListener() {

      @Override

      public void onClick(DialogInterface dialog,

      int which) {

      finish();

      }

      }).create();// 創建

      // 顯示對話框

      dialog.show();

      }

      private void doNewVersionUpdate() {

      int verCode = Config.getVerCode(this);

      String verName = Config.getVerName(this);

      StringBuffer sb = new StringBuffer();

      sb.append("當前版本:");

      sb.append(verName);

      sb.append(" Code:");

      sb.append(verCode);

      sb.append(", 發現新版本:");

      sb.append(newVerName);

      sb.append(" Code:");

      sb.append(newVerCode);

      sb.append(", 是否更新?");

      Dialog dialog = new AlertDialog.Builder(Update.this)

      .setTitle("軟件更新")

      .setMessage(sb.toString())

      // 設置內容

      .setPositiveButton("更新",// 設置確定按鈕

      new DialogInterface.OnClickListener() {

      @Override

      public void onClick(DialogInterface dialog,

      int which) {

      pBar = new ProgressDialog(Update.this);

      pBar.setTitle("正在下載");

      pBar.setMessage("請稍候...");

      pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);

      downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME);

      }

      })

      .setNegativeButton("暫不更新",

      new DialogInterface.OnClickListener() {

      public void onClick(DialogInterface dialog,

      int whichButton) {

      // 點擊"取消"按鈕之后退出程序

      finish();

      }

      }).create();// 創建

      // 顯示對話框

      dialog.show();

      }

      復制代碼

      4. 下載模塊

      注,本部分參考了前人的相關實現,

      http://www.apkbus.com/android-14576-1-1.html

      void downFile(final String url) {

      pBar.show();

      new Thread() {

      public void run() {

      HttpClient client = new DefaultHttpClient();

      HttpGet get = new HttpGet(url);

      HttpResponse response;

      try {

      response = client.execute(get);

      HttpEntity entity = response.getEntity();

      long length = entity.getContentLength();

      InputStream is = entity.getContent();

      FileOutputStream fileOutputStream = null;

      if (is != null) {

      File file = new File(

      Environment.getExternalStorageDirectory(),

      Config.UPDATE_SAVENAME);

      fileOutputStream = new FileOutputStream(file);

      byte[] buf = new byte[1024];

      int ch = -1;

      int count = 0;

      while ((ch = is.read(buf)) != -1) {

      fileOutputStream.write(buf, 0, ch);

      count += ch;

      if (length > 0) {

    標簽:

    相關閱讀

    達內新聞

    大香蕉99精品3线在线观看视频,亚洲欧美AV中文日韩二区91哥精品 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>