<li id="34b3z"></li>
    <nav id="34b3z"></nav>
  1. <wbr id="34b3z"><legend id="34b3z"></legend></wbr>
    
    

        1. <form id="34b3z"></form>
          <sub id="34b3z"><table id="34b3z"><th id="34b3z"></th></table></sub>

          ?

          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) {

          標簽:

          相關閱讀

          達內新聞

          一本之道高清在线观看一区_高清在线不卡二区_最新国产高清不卡a 百度 好搜 搜狗
          <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>