App在自己界面奔溃回到首页,状态栏沉浸式消失bug

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

以上。

猜你喜欢

转载自blog.csdn.net/cdhahaha/article/details/72974621