Android在线更新安装包,Android在线更新下载方案
目的
App的在線更新是每一個項目必有的功能,但在過程當(dāng)中會遇到一些問題,在此記錄下心得。
步驟
1、將最新版本號和本地版本號進(jìn)行對比;
2、如需更新,則彈出更新提示對話框;
3、下載更新APK文件,并顯示進(jìn)度條和通知欄;
4、安裝APK
具體流程
一、通過網(wǎng)絡(luò)接口獲取到線上最新版本號,將最新版本號和本地版本號進(jìn)行對比
首先從網(wǎng)絡(luò)回調(diào)接口中獲取最新版本號,再將本地版本號與最新版本號進(jìn)行對比,如果需要更新則彈出對話框
/**
* 更新提示對話框
*/
public void appUpdateDialog(final Context context, final UpdateCheckRetBean bean) {
new MaterialDialog.Builder(context)
.title("金米米") //標(biāo)題內(nèi)容
.titleColor(Color.parseColor("#FFC736")) //標(biāo)題顏色
.iconRes(R.drawable.ic_logo_share) //圖標(biāo)
.content(bean.getDetail()) //內(nèi)容
.positiveText("立即更新") //選擇更新
.canceledOnTouchOutside(false) //觸摸窗口邊界以外是否關(guān)閉窗口,設(shè)置 false
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
downloadDialog(context, bean.getUrl()); //應(yīng)用下載
setNotification(context, bean.getDetail()); //顯示通知欄
}
})
.negativeText("取消") //選擇取消
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
}
})
.show();
}
三、下載更新APK文件,并顯示進(jìn)度條和通知欄
這部分是重點,分三部分解決:
1、顯示進(jìn)度條:
/**
* 應(yīng)用下載對話框
*
* @param downloadUrl APK下載鏈接
*/
private void downloadDialog(final Context mContext, String downloadUrl) {
downLoadDialog = new MaterialDialog.Builder(mContext)
.customView(R.layout.layout_app_update, false) //自定義View
.title("更新中...")
.iconRes(R.drawable.ic_logo_share)
.titleColor(Color.parseColor("#FFC736"))
.negativeText("取消下載") //選擇取消
.canceledOnTouchOutside(false) // 觸摸窗口邊界以外是否關(guān)閉窗口,設(shè)置 false
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
ToastUtils.showShortToast(mContext, "取消更新");
dialog.dismiss();
notificationManager.cancel(NOTIFICATION_ID); //取消通知欄
OkHttpClientUtil.getInstance().cancelOkHttp("download"); //取消下載更新
}
})
.build();
//攔截手機(jī)返回鍵
downLoadDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
ToastUtils.showShortToast(mContext, "進(jìn)入后臺下載模式");
return keyCode != KeyEvent.KEYCODE_BACK &&
downLoadDialog != null && downLoadDialog.isShowing();
}
});
npbDownload = downLoadDialog.getCustomView().findViewById(R.id.npb_download); //設(shè)置進(jìn)度條
npbDownload.setProgressTextSize(45); //設(shè)置進(jìn)度條字體大小
downLoadDialog.show();
downloadApk(mContext, downloadUrl); //下載更新APK
}
3、通知欄展示進(jìn)度:
/**
* 創(chuàng)建通知欄
*/
private void setNotification(Context context, String detail) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notification = new Notification.Builder(context);
notification.setSmallIcon(R.drawable.ic_16) //設(shè)置通知的圖標(biāo)
.setTicker("正在加載更新包") //設(shè)置狀態(tài)欄的標(biāo)題
.setContentTitle("正在加載更新包") //設(shè)置標(biāo)題
.setContentText(detail) //設(shè)置內(nèi)容
.setDefaults(Notification.FLAG_NO_CLEAR) //設(shè)置默認(rèn)的提示音
.setPriority(Notification.PRIORITY_DEFAULT) //設(shè)置該通知的優(yōu)先級
.setOngoing(true) //讓通知左右滑的時候不能取消通知
.setWhen(System.currentTimeMillis()) //設(shè)置通知時間,默認(rèn)為系統(tǒng)發(fā)出通知的時間,通常不用設(shè)置
.setAutoCancel(true); //打開程序后圖標(biāo)消失
//解決5.0系統(tǒng)通知欄白色I(xiàn)con的問題
Drawable appIcon = getAppIcon(context);
Bitmap drawableToBitmap = null;
if (appIcon != null) {
drawableToBitmap = drawableToBitmap(appIcon);
}
if (drawableToBitmap != null) {
notification.setSmallIcon(R.drawable.ic_16);
notification.setLargeIcon(drawableToBitmap);
} else {
notification.setSmallIcon(context.getApplicationInfo().icon);
}
Notification notify = notification.build();
notify.flags |= FLAG_ONLY_ALERT_ONCE;
notificationManager.notify(NOTIFICATION_ID, notify);
}
/**
* 合成更新的Icon
*
* @param drawable
* @return
*/
public Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
/**
* 獲取App的Icon
*
* @param context
* @return
*/
public Drawable getAppIcon(Context context) {
try {
return context.getPackageManager().getApplicationIcon(context.getPackageName());
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
總結(jié)
以上是生活随笔為你收集整理的Android在线更新安装包,Android在线更新下载方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android shpe 三角形_绘制三
- 下一篇: 为什么整数在python中表示d_pyt