开发中遇到,在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;
}
}

以上。

更多相关文章

  1. "AndroidStudio 单元测试"-最简单最快的方法-ApplicationTest
  2. android在onCreate()方法中获取View的宽度与高度的方法实战
  3. W/System.err:at java.net.PlainDatagramSocketImpl.bind(PlainDa
  4. Android Studio获取数字签名(SHA1)的方法
  5. Android Volley:使用方法总结及实例解析
  6. eclipse下运行EasyAR官方sample的方法
  7. Android App性能信息获取方法
  8. Android Studio 检测内存泄漏与解决方法
  9. C#/Java 调用WSDL接口及方法

随机推荐

  1. linux用户管理及用户权力下放
  2. 如何在windows 10的linux子系统中启动jup
  3. linux环境下,配置eclipse nodejs开发环境
  4. [置顶] Linux 内核学习(1)
  5. linux下crontab 任务不执行的可能原因总
  6. 第四组内部linux比赛命题
  7. 有种生活态度叫 Linux
  8. Shell编程笔试题
  9. MEMCACHED缓存及状态查看
  10. CentOS7.2 通过nfs设置共享文件夹