APP在MIUI上运行,切换字体大小后没有调用onConfigurationChanged。

问题描述

需求是要保证APP的文字大小不受系统文字大小设置的影响。

我在搜索了相关问题之后,采用了重写getResource方法和onConfigurationChanged方法,同时在manifest文件中给activity进行配置的办法来解决这个问题。正常打开APP没有任何问题,字号确实不会随着系统设置而变化。

Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改

但是这样做,在华为平板(揽阅M2青春版,Android 5.1.1,EMUI 3.1)上没有问题,在小米手机(米6,Android 8.0,MIUI 10.3稳定版)上,**切换了字号之后回到APP,APP会自尽(不是闪退,下面会说)**。

代码展示

AndroidManifest.xml

<!-- 主界面 -->
        <activity
            android:name=".ui.MainActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|locale|layoutDirection|keyboard"
            android:exported="false"
            android:launchMode="standard"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

BaseActivity.java

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        LogHelper.customLogging("showControl",this.getClass().getName()+"执行了  onConfigurationChanged");
        if (newConfig.fontScale != 1)//非默认值
            getResources();
        super.onConfigurationChanged(newConfig);
    }

    /**
     * 重写 getResource 方法,防止系统字体影响
     */
    @Override
    public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
        Resources resources = super.getResources();
        if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
            android.content.res.Configuration configuration = resources.getConfiguration();
            configuration.fontScale = 1.0f;
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        }
        return resources;
    }

日志信息

这是我的米6的日志

图片说明

红线处执行的操作是:

1、APP进入后台;2、更改系统文字大小;3、APP回到前台;

可以看到mainActivity在完成了自己应该做的操作(销毁、创建、展示)后多做了一次销毁操作。而且onConfigurationChanged方法中的日志也没有被打印。

所以米6走的路径是相当于ManiFest文件中没有配置fontScale。

这是华为平板的日志

图片说明

红线处操作同上

这里就执行了onConfigurationChanged方法,只需要重新显示一下activity就可以了。

自己的分析

多了一个onDestroy,导致了APP还活着(AndroidStudio的Logcat一栏显示的包名后面没有DEAD字样),但是Activity已经没了,所以显示的是桌面,看起来是闪退一样,但其实只是他自尽了……

#**各位大神,救救孩子,这个问题怎么解决啊?!**

走投无路之下采用穷举法来解决问题,不光要加fontScale,还要加上uiMode(EMUI的就不用),深度定制版的系统太麻烦了,想买个pixel,emmmm又太贵了。