众所周知,当例如系统语言,横竖屏发生切换等Activitiy或Service中会回调onConfigurationChanged
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
但如果onConfigurationChanged回调时,我们是否可以知道到底是哪个配置发生了改变呢?是语言切换了?还是横竖屏发生变化了?还是屏幕尺寸发生变化了?哈哈!!!答案是可以的,今天开发中就碰到了这个问题,遂记录之。
方法也是很简单的,大致如下几个步骤:
1、记录一个当前的配置Configuration,我命名为mLastConfig;
2、当onConfigurationChanged回调,用newConfig和mLastConfig进行对比;
public class DemoService extends Service{
private Configuration mLastConfig;
@Override
public void onCreate() {
super.onCreate();
mLastConfig = new Configuration(getResources().getConfiguration());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if ((newConfig.diff(mLastConfig) & ActivityInfo.CONFIG_LOCALE) > 0) {
//TODO 语言切换
} else if((newConfig.diff(mLastConfig) & ActivityInfo.CONFIG_ORIENTATION) > 0){
//TODO 横竖屏切换
}
mLastConfig = new Configuration(newConfig);
}
}
通过Configuration#diff(Configuration delta)方法,会返回新旧值差异的int值,再通过位运算即可知道对应项是否变化。例如ActivityInfo.CONFIG_LOCALE=0x0004,若差异值第三位值为1,说明是CONFIG_LOCALE对应项发生了变化,即切换了语言。
ps:mLastConfig对象不能直接通过getResources().getConfiguration()赋值 ,需通过new Configuration(getResources().getConfiguration())的方式获取。否则当Configuration发生改变,mLastConfig也跟着改变。(不要问我怎么知道的)