Android站內(nèi)更新

一、添加引用

請(qǐng)注意使用最新版

api 'com.linc.android:base:0.1.50'

二、新建相關(guān)的類

①新建UpdateService繼承BaseLincUpdateService

import com.linc.android.base.update.BaseLincUpdateService;
import com.lkl.linc.app.utils.log.LogUtils;

public class UpdateService extends BaseLincUpdateService{
    @Override
    protected Class<?> onNotifyClass() {
        //通知欄點(diǎn)開后,需要彈出的界面
        return null;
    }

    @Override
    protected int setSmallIcon() {
        //通知欄圖標(biāo),注意是mipmap
        return android.R.mipmap.sym_def_app_icon;
    }

    @Override
    public int onSendProgressCode() {
        //發(fā)送下載進(jìn)度的code
        return Code.UPDATE_PROGRESS;
    }

    @Override
    protected int onSendDownLoadFinishedCode() {
        //發(fā)送下載完成通知的code
        return Code.UPDATE_DOWNLOAD_FINISHED;
    }
}

②新建更新彈窗對(duì)話框

import android.content.Context;
import android.os.CountDownTimer;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.linc.android.base.update.BaseLincUpdateDialog;
import com.linc.android.base.update.LincCheckUpdateBean;

public class UpdateDialog extends BaseLincUpdateDialog {

    private LoadingDialog loadingDialog;

    public UpdateDialog(@NonNull Context context, LincCheckUpdateBean bean) {
        super(context, bean);
    }

    @NonNull
    @Override
    protected int[] setMainColor() {
        //第0位是主題色,第1位是點(diǎn)擊后的顏色,實(shí)現(xiàn)按鈕點(diǎn)擊效果
        return new int[]{Color.BLUE, Color.YELLOW};
    }

    @Override
    protected View.OnClickListener onCancelClickListener(boolean isForce) {
        //點(diǎn)擊取消更新按鈕的動(dòng)作。如果是強(qiáng)制更新,取消后,需要停止服務(wù)并退出程序,否則只需要停止服務(wù)即可
       return v -> {
            if (isForce) {
                TipDialog.create(getContext()).title("此版本為強(qiáng)制更新的版本,如取消更新將直接關(guān)閉程序,是否取消?")
                        .setSureText("確定取消").setCancelText("暫不取消").onNoCloseClickListener((is, d) -> {
                            if (is) {
                                UpdateService.stop();
                                loadingDialog = new LoadingDialog(getContext());
                                loadingDialog.setCancelable(false);
                                loadingDialog.show();
                                //留一點(diǎn)時(shí)間給程序刪除資源
                                new CountDownTimer(1000, 1000) {

                                    @Override
                                    public void onTick(long left) {

                                    }

                                    @Override
                                    public void onFinish() {
                                        loadingDialog.dismiss();
                                        d.dismiss();
                                        App.exitOut();
                                    }
                                }.start();
                            } else {
                                d.dismiss();
                            }
                        }).show();
            } else {
                TipDialog.create(getContext()).title("確定取消更新?")
                        .setCancelText("暫不取消")
                        .setSureText("確定取消")
                        .onClickListener(is -> {
                            if (is) {
                                //停止服務(wù)
                                UpdateService.stop();
                                dismiss();
                            }
                        }).show();

            }
        };
    }

    @Override
    protected int onCancelSetupCallActionBack() {
        //點(diǎn)擊安裝時(shí),發(fā)送的通知code
        return Code.UPDATE_CANCEL_SETUP;
    }

    @NonNull
    @Override
    protected Class<?> setUpdateService() {
        //剛剛創(chuàng)建的UpdateService
        return UpdateService.class;
    }
}

三、添加權(quán)限和服務(wù)

①權(quán)限

    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <!--發(fā)送前臺(tái)通知,需要的權(quán)限-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <!--安裝應(yīng)用需要的權(quán)限1,不需要?jiǎng)討B(tài)申請(qǐng)-->
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <!--安裝應(yīng)用需要的權(quán)限2,不需要?jiǎng)討B(tài)申請(qǐng)-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <!--寫上就行,不需要?jiǎng)討B(tài)申請(qǐng)-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <!--安卓15要寫上這個(gè)權(quán)限(這里暫時(shí)用不到,可以不寫)-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />

②添加服務(wù)

    <service
        android:name=".UpdateService"
        android:exported="false"
        android:foregroundServiceType="mediaPlayback" />

四、頁(yè)面配置
①在baseActivity中添加檢查更新的代碼,并在有需要的地方,調(diào)用此方法

    protected void checkUpdate(boolean showTip) {
        if (updateDialog != null) {
            if (UpdateService.isDownloading()) {
                updateDialog.show();
                return;
            } else {
                updateDialog = null;
            }
        }
        getComPresenter().checkUpdate((b, i, s, data) -> {
            if (b) {
                if (data.isNeedUpdate()) {
                    //注意數(shù)據(jù)類型的轉(zhuǎn)換
                    updateDialog = new UpdateDialog(activity, data);
                    updateDialog.show();
                } else if (showTip) {
                    MyToast.showToast("已是最新版本");
                }
            } else {
                if (showTip) {
                    MyToast.showToast(s);
                }
            }
        });
    }

②在baseActivity中添加code監(jiān)聽

    @Override
    public void onMessage(int type, @NonNull Object obj) {
        super.onMessage(type, obj);
        switch (type) {
            case Code.UPDATE_PROGRESS:
                if (updateDialog != null && updateDialog.isShowing()) {
                    updateDialog.setUpdatingUi();
                }
                break;
            case Code.UPDATE_DOWNLOAD_FINISHED:
                //如下載完成了
                if (updateDialog != null && updateDialog.isShowing()) {
                    //并且已經(jīng)有正在展示的對(duì)話框,就直接更新
                    updateDialog.setUpdatingUi();
                    UpdateService.sendSetUp();
                } else {
                    //所有收到下載完成的activity都彈出安裝對(duì)話框
                    checkUpdate(false);
                }
                break;
            case Code.UPDATE_CANCEL_SETUP:
                //點(diǎn)擊了取消安裝,就關(guān)閉所有已經(jīng)彈出的對(duì)話框
                if (updateDialog != null) {
                    updateDialog.dismiss();
                    updateDialog = null;
                }
                break;
        }
    }

五、特別注意

1、要在程序標(biāo)簽下添加FileProvider

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

2、在退出登錄時(shí),需要調(diào)用 UpdateService.stop() 以停止服務(wù)

UpdateService.stop()

3、檢查更新的時(shí)候,如果已經(jīng)有正在更新的服務(wù)了,就直接彈窗好了

    private void checkUpdate(boolean showTip) {
        if (updateDialog != null) {
            if (UpdateService.isDownloading()) {
                updateDialog.show();
                return;
            } else {
                updateDialog = null;
            }
        }
        //其他代碼
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容