App在自己界面奔溃回到首页,状态栏沉浸式消失bug
16lz
2021-01-22
开发中遇到,在apk内部子级界面操作,遇到奔溃,应用回到主页,初始状态栏都是与整个应用的主题色一样的,奔溃后,主页状态栏沉浸式消失,显示系统的黑色
思考:修改状态栏的方法我是在BaseActivity中的onCreate方法中调用的
众所周知,onCreate方法是在界面初始化时调用所以奔溃时,必然没有调用这个方法,根据以往经验,可以看这篇文章《Android学习之Activity深入》可知,在奔溃时,Activity会回调onRestoreInstanceState
方法,所以在BaseActivity之中重写了该方法,在方法中调用修改状态栏的方法
ok,问题解决。
附上状态栏方法代码
protected void ChangeStatusBarCompat(boolean isDark, int bgColor) {
if (Constants.barHeight > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT /*&& Build.VERSION.SDK_INT <Build.VERSION_CODES.M*/) {
switch (getBrand()) {
case 1:
BrandCustomizationUtils.setMIUIStatusBarColor(this, isDark);
StatusBarCompat.compat(this, ContextCompat.getColor(this, R.color.color_trans_white));
break;
case 2:
BrandCustomizationUtils.setFlyMeStatusBarColor(this, isDark);
StatusBarCompat.compat(this, ContextCompat.getColor(this, R.color.color_trans_white));
break;
default:
if (bgColor != -1)
StatusBarCompat.compat(this, bgColor);
else
StatusBarCompat.compat(this, ContextCompat.getColor(this, R.color.c_efeff0));
break;
}
}
}
barHeight是Constants类中的一个常量,默认为0
//状态栏高度
public static int barHeight = 0;
getBrand()
方法,获取品牌
/**
* API<4.4不用管沉浸式, 4.4~6.0
* M>API>4.4 判断手机型品牌 可控则通过反射 来改变状态栏颜色,不可控则改变状态栏背景色
* API>M
*/
private int getBrand() {
String MODEL = Build.MODEL;
if (MODEL == null || MODEL.length() == 0)
return 0;
if (MODEL.toLowerCase().contains("mi")) {
return 1;
} else if (MODEL.toLowerCase().contains("MEIZU") || MODEL.toLowerCase().contains("m5")) {
return 2;
} else {
return 0;
}
}
BrandCustomizationUtils
如下
package cn.iprivatecloud.cloudapp.tools;
import android.app.Activity;
import android.view.Window;
import android.view.WindowManager;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import static android.R.attr.type;
/**
* Created by liang on 2017/3/9.
*/
public class BrandCustomizationUtils {
/**
* setDarkStatusBar on FlyMe
* 设置状态栏字体为暗色 仅魅族有效
* 黑底白字 -> 白底黑字
*/
public static void setFlyMeStatusBarColor(Activity activity, boolean isDark) {
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
try {
Class<?> instance = Class.forName("android.view.WindowManager$LayoutParams");
int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(lp);
Field field = instance.getDeclaredField("meizuFlags");
field.setAccessible(true);
int origin = field.getInt(lp);
if (isDark) {
field.set(lp, origin | value);
} else {
field.set(lp, (~value) & origin);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void setMIUIStatusBarColor(Activity context, boolean isDark) {
Window window = context.getWindow();
Class clazz = window.getClass();
try {
int tranceFlag = 0;
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_TRANSPARENT");
tranceFlag = field.getInt(layoutParams);
field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
if (type == 0){
extraFlagField.invoke(window, tranceFlag, tranceFlag);//只需要状态栏透明
}else if(type == 1){
extraFlagField.invoke(window, tranceFlag | darkModeFlag, tranceFlag | darkModeFlag);//状态栏透明且黑色字体
}else {
extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
}
if (isDark) {
extraFlagField.invoke(window, tranceFlag | darkModeFlag, tranceFlag | darkModeFlag);
} else {
extraFlagField.invoke(window, 0, darkModeFlag);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
StatusBarCompat
如下
public class StatusBarCompat {
private static final int INVALID_VAL = -1;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static void compat(Activity activity, int statusColor) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (statusColor != INVALID_VAL) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
//| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
//| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(statusColor);
}
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
int color = ContextCompat.getColor(activity, android.R.color.transparent);
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
if (statusColor != INVALID_VAL) {
color = statusColor;
}
View statusBarView = contentView.getChildAt(0);
//改变颜色时避免重复添加statusBarView
if (statusBarView != null && statusBarView.getMeasuredHeight() == getStatusBarHeight(activity)) {
statusBarView.setBackgroundColor(color);
return;
}
statusBarView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));
statusBarView.setBackgroundColor(color);
contentView.addView(statusBarView, lp);
}
}
public static void compat(Activity activity) {
compat(activity, INVALID_VAL);
}
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
以上。
更多相关文章
- "AndroidStudio 单元测试"-最简单最快的方法-ApplicationTest
- android在onCreate()方法中获取View的宽度与高度的方法实战
- W/System.err:at java.net.PlainDatagramSocketImpl.bind(PlainDa
- Android Studio获取数字签名(SHA1)的方法
- Android Volley:使用方法总结及实例解析
- eclipse下运行EasyAR官方sample的方法
- Android App性能信息获取方法
- Android Studio 检测内存泄漏与解决方法
- C#/Java 调用WSDL接口及方法