Android5.0和8.0应用层更改系统语言
修改app应用语言有两种方法,一种是修改app应用内部语言,通过Configuration的locale修改,还有一种是修改系统语言主要是通过反射,本文由于工作需要修改系统语言,所以重点介绍下第二种方法。
Android 5.0
Class classActivityManagerNative = Class.forName("android.app.ActivityManagerNative");
Method getDefault = classActivityManagerNative.getDeclaredMethod("getDefault");
Object objIActivityManager = getDefault.invoke(classActivityManagerNative);
Class classIActivityManager = Class.forName("android.app.IActivityManager");
Method getConfiguration = classIActivityManager.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) getConfiguration.invoke(objIActivityManager);
config.locale = getLocaleByType(type);
Class clzConfig = Class
.forName("android.content.res.Configuration");
java.lang.reflect.Field userSetLocale = clzConfig
.getField("userSetLocale");
userSetLocale.set(config, true);
Class[] clzParams = {Configuration.class};
Method updateConfiguration = classIActivityManager.getDeclaredMethod("updateConfiguration", clzParams);
updateConfiguration.invoke(objIActivityManager, config);
BackupManager.dataChanged("com.android.providers.settings");
Android 8.0
Class activityManagerNative = Class.forName("android.app.ActivityManagerNative");
Method getDefault = activityManagerNative.getDeclaredMethod("getDefault");
Object objIActMag = getDefault.invoke(activityManagerNative);
Class iActivityManager = Class.forName("android.app.IActivityManager");
Method getConfiguration = iActivityManager.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) getConfiguration.invoke(objIActMag);
config.setLocales(new LocaleList(getLocaleByType(type)));
Class[] clzParams = {Configuration.class};
Method updateConfiguration = iActivityManager.getDeclaredMethod("updatePersistentConfiguration", clzParams);
updateConfiguration.invoke(objIActMag, config);
两者的区别
1. 5.0 是设置Configuration的locale是通过config.locale,而8.0是通过config.setLocales。
2. 5.0 是设置Configuration的locale入参是locale对象,而8.0Configuration的locale入参是存有locale对象的list对象。
3. 5.0是通过android.app.IActivityManager的updateConfiguration方法设置,而8.0是通过android.app.IActivityManager的updatePersistentConfiguration方法设置。