Android 5.1 修改系統(tǒng)默認(rèn)語言

折騰了下下這個(gè)很2的問題。
網(wǎng)上放的方法比較舊, Android5.1的話, 設(shè)置后當(dāng)時(shí)生效, 重啟后就失效了。

        private void updateLanguage(Locale locale) {
            try {
                Object objIActMag, objActMagNative;
                
                Class clzIActMag = Class.forName("android.app.IActivityManager");
                
                Class clzActMagNative = Class.forName("android.app.ActivityManagerNative");
                
                
                Method mtdActMagNative$getDefault = clzActMagNative
                        .getDeclaredMethod("getDefault");
                
                objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
                
                Method mtdIActMag$getConfiguration = clzIActMag
                        .getDeclaredMethod("getConfiguration");
                
                Configuration config = (Configuration) mtdIActMag$getConfiguration
                        .invoke(objIActMag);
                
                config.locale = locale;
                
                Class clzConfig = Class.forName("android.content.res.Configuration");
                java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale");
                userSetLocale.set(config, true);
                
                // 此處需要聲明權(quán)限:android.permission.CHANGE_CONFIGURATION
                // 會重新調(diào)用 onCreate();
                Class[] clzParams = { Configuration.class };
                
                Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod("updateConfiguration", clzParams);
                
                mtdIActMag$updateConfiguration.invoke(objIActMag, config);
                
                BackupManager.dataChanged("com.android.providers.settings");
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

不同的地方在添加了

Class clzConfig = Class.forName("android.content.res.Configuration"); 
java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale"); 
userSetLocale.set(config, true);

Debug發(fā)現(xiàn)的邏輯是:
1: 持久化保存下來

SystemProperties.set("persist.sys.language", l.getLanguage());
SystemProperties.set("persist.sys.country", l.getCountry());

2: 開機(jī)AndroidRuntime讀取這個(gè)屬性, 更新系統(tǒng)之前的屬性。

估計(jì)是為了方便跑測試的Case添加的這個(gè)邏輯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容