我的方式不一定适合所有人,看需要可以选择是否使用。
集成bugly的更新功能,我想用到这个的时候应该都弄完了吧,没弄完的话,可以参考以下文档:
https://blog.youkuaiyun.com/Liu_ser/article/details/82886268
bugly全量更新与热修复。
下面是自定义更新弹窗,不过是个类,而不是弹窗,如果有想法的话,可以自己修改成弹窗。
布局,名字最好别乱改,要与bugly文档里的进行对应
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/white"
android:layout_marginTop="400px"
android:layout_marginLeft="100px"
android:layout_marginRight="100px"
>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text=""
android:layout_marginLeft="10dp"
android:textColor="@color/black"
android:layout_marginTop="10px"
/>
<TextView
android:id="@+id/version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="版本号:"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
/>
<TextView
android:id="@+id/size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="包大小:"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
android:visibility="gone"
/>
<TextView
android:id="@+id/time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="更新时间:"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"
android:visibility="gone"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="更新说明:"
android:layout_marginTop="5dp"
android:textColor="@color/black"
android:layout_marginLeft="10dp"
/>
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="修改信息"
android:layout_marginTop="5dp"
android:textColor="@color/black"
android:layout_marginLeft="10dp"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="下载进度"
android:layout_marginTop="5dp"
android:gravity="center"
android:visibility="gone"
/>
<ProgressBar
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="20dp"
style="?android:attr/progressBarStyleHorizontal"
android:layout_gravity="center_vertical"
android:id="@+id/progress"
android:max="100"
android:progress="0"
android:layout_width="match_parent"
android:layout_height="20dp"
android:visibility="gone"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/two_light_grey"
android:layout_marginTop="5dp"
>
<Button
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="1dp"
android:layout_marginRight="1dp"
android:text="下次再说"
android:textSize="20sp"
android:textColor="@color/dark_grey"
/>
<Button
android:id="@+id/start"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="1dp"
android:textSize="20sp"
android:text="立即更新"
android:textColor="@color/black"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
更新类:
/**更新弹窗demo
* Created by IKL on 2019/4/22
*/
public class UpgradeActivity extends Activity {
private TextView tv;
private TextView title;
private TextView version;
private TextView size;
private TextView time;
private TextView content;
private Button cancel;
private Button start;
private ProgressBar number;
private int fileSize;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_upgrade);
//设置状态栏
PublicMethods.setImmersionStatus(UpgradeActivity.this, R.color.dark_blue1);
tv = getView(R.id.tv);
title = getView(R.id.title);
version = getView(R.id.version);
size = getView(R.id.size);
time = getView(R.id.time);
content = getView(R.id.content);
cancel = getView(R.id.cancel);
start = getView(R.id.start);
number = getView(R.id.progress);
/*获取下载任务,初始化界面信息*/
updateBtn(Beta.getStrategyTask());
//包大小
fileSize= new Long(Beta.getUpgradeInfo().fileSize).intValue();
tv.setText(tv.getText().toString() + Beta.getStrategyTask().getSavedLength() + "");//当前下载进度,不过隐藏了
/*获取策略信息,初始化界面信息*/
title.setText(title.getText().toString() + Beta.getUpgradeInfo().title);//标头
version.setText(version.getText().toString() + Beta.getUpgradeInfo().versionName);//版本号
size.setText(size.getText().toString() + Beta.getUpgradeInfo().fileSize + "");//更新包大小,已隐藏
long times=Beta.getUpgradeInfo().publishTime/1000;//更新时间,返回的是long时间戳,不过转化后有点对不上,以隐藏
String s = timeStampToDate(times);
time.setText(time.getText().toString() + s + "");
content.setText(Beta.getUpgradeInfo().newFeature);//更新说明
number.setMax(fileSize );//设置进度条最大值,就是更新包的大小
/*为下载按钮设置监听*/
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// tv.setVisibility(View.VISIBLE);
number.setVisibility(View.VISIBLE);
DownloadTask task = Beta.startDownload();
updateBtn(task);
if (task.getStatus() == DownloadTask.DOWNLOADING) {
// finish();
ToastUtils.showShortToast(UpgradeActivity.this,"开始下载");
}
}
});
/*为取消按钮设置监听*/
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Beta.cancelDownload();
Intent intent = new Intent();//取消更新回到起始页
setResult(1001, intent);
finish();
}
});
/*注册下载监听,监听下载事件*/
Beta.registerDownloadListener(new DownloadListener() {
@Override
public void onReceive(DownloadTask task) {
updateBtn(task);
tv.setText(task.getSavedLength() + "");
int li= new Long(task.getSavedLength()).intValue();
number.setProgress(li);//更新进度条
}
@Override
public void onCompleted(DownloadTask task) {
updateBtn(task);
tv.setText(task.getSavedLength() + "");
}
@Override
public void onFailed(DownloadTask task, int code, String extMsg) {
updateBtn(task);
tv.setText("failed");
number.setVisibility(View.GONE);
}
});
}
//将long的时间戳转为时间
public static String timeStampToDate(long tsp, String... format) {
SimpleDateFormat sdf;
if (format.length < 1) {
sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.getDefault());
} else {
sdf = new SimpleDateFormat(format[0], Locale.getDefault());
}
return sdf.format(tsp);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
/*注销下载监听*/
Beta.unregisterDownloadListener();
}
public void updateBtn(DownloadTask task) {
/*根据下载任务状态设置按钮*/
switch (task.getStatus()) {
case DownloadTask.INIT:
case DownloadTask.DELETED:
case DownloadTask.FAILED: {
start.setText("开始下载");
}
break;
case DownloadTask.COMPLETE: {
start.setText("安装");
}
break;
case DownloadTask.DOWNLOADING: {
start.setText("暂停");
}
break;
case DownloadTask.PAUSED: {
start.setText("继续下载");
}
break;
}
}
public <T extends View> T getView(int id) {
return (T) findViewById(id);
}
}
然后在清单文件里进行注册
<activity android:name=".ui.UpgradeActivity"
android:theme="@style/noAnimTheme"
/>
<!--透明背景-->
<style name="noAnimTheme"
parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:duration">800</item>
</style>
在需要更新的地方调用:
UpgradeInfo upgradeInfo = Beta.getUpgradeInfo();
if (upgradeInfo != null) {
//进来就检测是否有新版本 有就提醒更新并显示红点
//升级策略 1建议 2强制 3手工
int upgradeType = Beta.getUpgradeInfo().upgradeType;
if (upgradeType==2){
checkVersionName();//强制更新
}else {
//非强制更新
Intent intent = new Intent(SplashActivity.this, UpgradeActivity.class);
startActivityForResult(intent, 1000);
}
} else {
// //隐藏红点提示,没有更新策略的处理
}
//-------------强制更新调用的,也可以不调用--------
//bugly检查更新,设置更新弹窗弹出时间间隔
private void checkVersionName() {
Beta.checkUpgrade();
Beta.strToastYourAreTheLatestVersion = null;
Beta.strToastCheckingUpgrade = null;
Beta.strToastCheckUpgradeError = null;
Beta.upgradeCheckPeriod = 60 * 1000;
}
//-------------回传值接受,接收到自定义更新类那里下次再说的事件,让功能继续向下走----------------------
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1000 && resultCode == 1001)
{
getNet(1000);
}
}
这么一来,自定义更新界面就完成了,布局自己随意改,但是现在有个问题,就是会在你的基础上,监测更新的时候回再次弹出一个原弹窗覆盖你现在的弹窗,那就不行了,所以我用了一个取巧的方式,如果你有别的方法也能告诉我一声。
在全局类里,设置bugly的初始化,以及自动检查更新,如果不设置的话就需要你手动设置,也就是我上面强制更新里面的那些,而为了不让弹窗覆盖,就是设置一个canShowUpgradeActs,设置显示更新弹窗的类,除了此类外不在其余类显示,这样你可以将类设置成一个不重要的类,也可以是一个专门用来在项目内部自主更新的类里面,最明显的就是设置里的,大家都懂。
* 只允许在MainActivity上显示更新弹窗,其他activity上不显示弹窗;
* 不设置会默认所有activity都可以显示弹窗;
*/
Beta.autoInit = true;
Beta.autoCheckUpgrade = true;//自动检查更新
/**
* 点击过确认的弹窗在APP下次启动自动检查更新时会再次显示;
*/
// Beta.showInterruptedStrategy = false;
Beta.canShowUpgradeActs.add(显示原更新弹窗的类,可以放一个专门用来更新的类);//可以添加多个此方法
Bugly.init(this, "换成自己项目的", false);
自定义更新到这里就结束了,如果有问题,百度或者看看官方文档是最好的方法,虽然好多特立独行的业务需求官方文档也是有些无能为力,但是也是一个思路,比如跟我一样,用一些取巧的方式来达成目的,毕竟结果是最重要的,而不是方法。
本文介绍如何自定义Bugly的更新弹窗,包括创建更新界面、设置更新类及在清单文件中注册,实现非强制与强制更新的区分处理。
5559

被折叠的 条评论
为什么被折叠?



