<rp id="yy9qd"></rp>

    <em id="yy9qd"><ruby id="yy9qd"></ruby></em>

      <rp id="yy9qd"><object id="yy9qd"></object></rp>

    1. <th id="yy9qd"></th>

      ?

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

      標簽:

      相關閱讀

      達內新聞