Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android檢查更新庫CheckUpdateLibrary使用教程

Android檢查更新庫CheckUpdateLibrary使用教程

編輯:關於Android編程

檢查更新並下載更新可以說是一個app必備的功能了.

既然是必備功能,往往需要考慮很多東西,如下:

1,更新方式:

一個軟件有更新了,如果是上線了新的功能或修復了某些bug,或者是服務端的接口變了等,需要強制用戶更新軟件,不然就退出應用,而如果只是進行性能的優化或者界面變化但是數據不變的更新,往往不需要強制更新,所以這就產生兩種更新需求:強制更新與非強制更新.

2,後台下載:

強制更新可能實現起來較為簡單,必須要求用戶下載完更新並安裝後才能使用,在技術含量上要求不是太高,而對於非強制更新方式,用戶可以選擇下載更新,並且要切換到後台進行下載,也就是說要使用到service,但是後台下載又會產生第3點要求.

3,界面展示:

在後台下載的應用,需要在界面上展示實時下載進度,對於這塊,很多應用都是選擇在通知欄上展示,而CheckUpdateLibrary庫也不例外,但是光展示實時下載進度還不夠,當應用下載完畢,還得需要進行安裝應用,而用戶可以選擇不安裝應用,但是當他想安裝的時候,你不能讓用戶再下載一遍吧,所以需要讓用戶有個地方直接點擊就可以安裝之前下載的應用,而CheckUpdateLibrary同樣選擇在通知欄展示一個不可刪除的通知,提示用戶已經下載完成,點擊就可以安裝.而另一方面,如果在軟件後台下載的過程中,由於不可預測原因,導致軟件下載失敗,你需要讓用戶知道軟件下載失敗了,對於這一點,CheckUpdateLibrary同樣是在通知欄展示一個通知,提示用戶軟件下載失敗了,而用戶可以點擊該通知,重新激活下載Service進行重新下載.

4,網絡狀態判斷:

可能用戶在檢查更新時用的是流量但是用戶自己不知道,在下載的時候可能會直接下載,所以從用戶的角度出發,在有更新的Dialog彈出來的時候,就需要讓用戶知道他當前的網絡環境是移動網絡環境還是WIFI網絡環境,從而用戶可以選擇是否使用當前網絡環境進行下載應用.

5,可移植性:

既然每個應用都需要檢查更新,下載更新功能,那麼就必須有超強的可移植性,我們不能在這個應用寫一份檢查更新代碼,然後其他應用需要的時候,再把這些代碼粘貼過來,這樣做會很容易出錯,並且很麻煩,而采用CheckUpdateLibrary,直接在Android Studio中一句話引入該庫就可以使用,so方便!!!so快捷!!!

 

而顯然,網絡上已經有一些關於檢查更新或下載更新的庫,所以CheckUpdateLibrary相比於其他庫有什麼優勢呢?

1,零耦合:CheckUpdateLibrary從檢查更新到下載更新全部采用HttpURLConnection,Dialog同樣自定義,沒有引入任何其他第三方庫,而其他庫要麼是用的第三方網絡請求框架,要麼用的是別人封裝好的dialog.所以開發者可能會吐槽,這只是一個單純的檢查更新和下載更新功能,我卻需要多引入很多第三方庫,這無形之中增加了我APK的體積,我很不爽!!!而用這個庫,開發者完全不用擔心這些.

2,體積小:基於第一點,所以CheckUpdateLibrary庫體積超小,只有10多kb,

3,兼容6.0:因為使用的是HttpURLConnection,所以6.0系統同樣適配

4,可擴展性:CheckUpdateLibrary內置了一個實體類CheckUpdateInfo,用來接收檢查更新時返回的json數據,當然前提得和服務端商定好,對接好字段.而如果不想使用內置實體,開發者完全可以自定義自己的實體類,但是必須保證自定義的實體類中包含newAppVersionCode字段,該字段在庫中用來判斷是否有更新,所以必須包含,不然會檢查不到是否有更新.目前CheckUpdateLibrary只支持實體類的擴展,Dialog還只能用它提供的.

5,其他功能:比如可以自定義apk文件的存儲路徑,文件名,後台下載時是否在通知欄顯示實時下載進度等.

 

那麼如何使用呢?

使用Android Studio的小伙伴可以在gradle中直接引用如下一句話:

compile 'com.qiangxi.checkupdatelibrary:checkupdatelibrary:1.0.2'

使用eclipse的小伙伴只能從github中下載library文件,然後引入到項目中使用了,

CheckUpdateLibrary的github地址如下:

https://github.com/qiangxi/CheckUpdateLibrary

 

在代碼中,只需要這樣做即可,代碼如下:

 

package com.qiangxi.checkupdatelibrarydemo;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.qiangxi.checkupdatelibrary.bean.CheckUpdateInfo;
import com.qiangxi.checkupdatelibrary.dialog.ForceUpdateDialog;
import com.qiangxi.checkupdatelibrary.dialog.UpdateDialog;

public class MainActivity extends AppCompatActivity {
    private CheckUpdateInfo mCheckUpdateInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
    }

    private void initData() {
        //被注釋的代碼用來進行檢查更新,這裡為了方便,模擬一些假數據
//        Q.checkUpdate("post", getVersionCode(), "checkUpdateUrl", new CheckUpdateCallback() {
//            @Override
//            public void onCheckUpdateSuccess(String result, boolean hasUpdate) {
//                //result:服務端返回的json
//                CheckUpdateInfo checkUpdateInfo = new Gson().fromJson(result, CheckUpdateInfo.class);
//                //有更新,顯示dialog等
//                if (hasUpdate) {
//                    //強制更新,這裡用0表示強制更新,實際情況中可與服務端商定什麼數字代表強制更新即可
//                    if (checkUpdateInfo.getIsForceUpdate() == 0) {
//                        //show ForceUpdateDialog
//                    }
//                    //非強制更新
//                    else {
//                        //show UpdateDialog
//                    }
//                } else {
//                    //無更新,提示已是最新版等
//                }
//            }
//
//            @Override
//            public void onCheckUpdateFailure(String failureMessage, int errorCode) {
//                //failureMessage:一般為try{}catch(){}捕獲的異常信息
//                //errorCode:暫時沒什麼用
//            }
//        });
        //模擬一些假數據
        mCheckUpdateInfo = new CheckUpdateInfo();
        mCheckUpdateInfo.setAppName("android檢查更新庫")
                .setIsForceUpdate(1)//設置是否強制更新,該方法的參數只要和服務端商定好什麼數字代表強制更新即可
                .setNewAppReleaseTime("2016-10-14 12:37")//軟件發布時間
                .setNewAppSize(12.3f)//單位為M
                .setNewAppUrl("http://shouji.360tpcdn.com/160914/c5164dfbbf98a443f72f32da936e1379/com.tencent.mobileqq_410.apk")
                .setNewAppVersionCode(20)//新app的VersionCode
                .setNewAppVersionName("1.0.2")
                .setNewAppUpdateDesc("1,優化下載邏輯\n2,修復一些bug\n3,完全實現強制更新與非強制更新邏輯\n4,非強制更新狀態下進行下載,默認在後台進行下載\n5,當下載成功時,會在通知欄顯示一個通知,點擊該通知,進入安裝應用界面\n6,當下載失敗時,會在通知欄顯示一個通知,點擊該通知,會重新下載該應用\n7,當下載中,會在通知欄顯示實時下載進度,但前提要dialog.setShowProgress(true).");
    }

    /**
     * 強制更新
     */
    public void forceUpdateDialogClick(View view) {
        mCheckUpdateInfo.setIsForceUpdate(0);
        if (mCheckUpdateInfo.getIsForceUpdate() == 0) {
            ForceUpdateDialog dialog = new ForceUpdateDialog(MainActivity.this);
            dialog.setAppSize(mCheckUpdateInfo.getNewAppSize())
                    .setDownloadUrl(mCheckUpdateInfo.getNewAppUrl())
                    .setTitle(mCheckUpdateInfo.getAppName() + "有更新啦")
                    .setReleaseTime(mCheckUpdateInfo.getNewAppReleaseTime())
                    .setVersionName(mCheckUpdateInfo.getNewAppVersionName())
                    .setUpdateDesc(mCheckUpdateInfo.getNewAppUpdateDesc())
                    .setFileName("這是QQ.apk")
                    .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/checkupdatelib").show();
        }
    }

    /**
     * 非強制更新
     */
    public void UpdateDialogClick(View view) {
        mCheckUpdateInfo.setIsForceUpdate(1);
        if (mCheckUpdateInfo.getIsForceUpdate() == 1) {
            UpdateDialog dialog = new UpdateDialog(MainActivity.this);
            dialog.setAppSize(mCheckUpdateInfo.getNewAppSize())
                    .setDownloadUrl(mCheckUpdateInfo.getNewAppUrl())
                    .setTitle(mCheckUpdateInfo.getAppName() + "有更新啦")
                    .setReleaseTime(mCheckUpdateInfo.getNewAppReleaseTime())
                    .setVersionName(mCheckUpdateInfo.getNewAppVersionName())
                    .setUpdateDesc(mCheckUpdateInfo.getNewAppUpdateDesc())
                    .setFileName("這是QQ.apk")
                    .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/checkupdatelib")
                    //該方法需設為true,才會在通知欄顯示下載進度,默認為false,即不顯示
                    //該方法只會控制下載進度的展示,當下載完成或下載失敗時展示的通知不受該方法影響
                    //即不管該方法是置為false還是true,當下載完成或下載失敗時都會在通知欄展示一個通知
                    .setShowProgress(true)
                    .setIconResId(R.mipmap.ic_launcher)
                    .setAppName(mCheckUpdateInfo.getAppName()).show();
        }
    }

    /**
     * 獲取當前應用版本號
     */
    private int getVersionCode() {
        try {
            PackageManager packageManager = getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return -1;
        }
    }
}

來張效果圖:

 

非強制更新:

\

強制更新:

\

 

最後,再貼一遍CheckUpdateLibrary的github地址:

https://github.com/qiangxi/CheckUpdateLibrary

歡迎start或fork!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved