区分不同类型的配置更改

时间:2016-08-12 22:48:47

标签: android

我想区分配置更改,例如:屏幕旋转时与用户更改系统区域设置时的比较。

就我而言,我通过API获得了一些与语言环境相关的数据;当屏幕旋转时,我不想再次打电话,但是我确实希望在场地变化时这样做。

我猜有" hacky"这样做的方法,如在侦听区域设置更改,保存以前的区域设置等,但我正在寻找更清洁的东西。

人们如何在配置更改方面处理这样的缓存情况?

2 个答案:

答案 0 :(得分:0)

事实上,这恰好是“与语言环境相关的数据”与此问题没有多大关系。如果它是与语言环境无关的数据,则在配置更改后您不一定要再次进行调用。

所以,你应该像处理一般情况一样处理你的情况。两个主要标准是:

  1. 数据是否需要在流程终止后继续存在?如果是,则需要保留数据(数据库,SharedPreferences或其他类型的文件),可能还有内存缓存以进行优化。如果不是,内存缓存就足够了。

  2. 数据有多大?如果它是字节数(相对于KB / MB),则可以将其作为内存缓存放在已保存的实例状态Bundle中。如果不是,请使用一些具有适当LRU样式上限的进程级高速缓存(例如,static单例数据管理器)作为内存高速缓存。即使在这种情况下,您也可以在保存的实例状态Bundle中放置一些标识数据,以帮助您了解从内存缓存或磁盘重新加载的内容(如果进程终止)。

  3. 然后,在配置更改中,在相应的生命周期方法中,查看是否有针对当前区域设置缓存的数据(无论是不同的区域设置还是同一区域设置不再重要)。如果您没有当前语言环境的缓存数据,请加载它。

答案 1 :(得分:0)

如果要阻止某些配置更改,可以修改configChanges属性。一旦你将它设置为仅重新加载你想要的配置类型,我建议存储一个静态引用configuration的属性。

例如:

public void onCreate(Bundle savedInstanceState) {

    currentOrientation = getResources().getConfiguration().orientation;

}

public void onConfigurationChanged(Configuration newConfig) {

    if (currentOrientation != newConfig.orientation) {
        // orientation change
    }

    currentOrientation = newConfig.orientation;

}