一、添加引用
請(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;
}
}
//其他代碼
}