回 帖 发 新 帖 刷新版面

主题:保留一个对象在一个配置更改

如果重启你的activity,你需要恢复大量的数据,重新建立一个网络 连接,或者执行其他密集型操作,然后一次完全启动由于配置更改 可能是一个缓慢的用户体验。 同样,它可能不可能完全恢复 活动状态的 包 该系统为你保存的 onSaveInstanceState() 回调它不是 设计将大对象(如位图)和里面的数据必须序列化,然后 反序列化,这也会消耗大量内存和使配置改变得很慢。 在这样一个 情况,可以缓解你程序的负担活动通过保留一个有状态的 对象 当你的activity重启由于配置更改。

保留一个对象在运行时配置改变:

覆盖 onRetainNonConfigurationInstance() 方法返回 对象你想保留。
当你再次创建活动时,调用 getLastNonConfigurationInstance() 恢复你的对象。
当Android系统关闭你的activity由于配置更改,它调用 onRetainNonConfigurationInstance() 之间的 onStop() 和 onDestroy() 回调。 在你的 实施 onRetainNonConfigurationInstance() ,你可以返回 任何 对象 你需要为了有效地恢复你的国家之后 配置更改。

一个场景,在该场景中,这可能是有价值的是如果你的应用程序加载大量的数据 WEB。 如果用户更改设备的方向和activity重启,你的应用程序 必须重新获取数据,这可能是缓慢的。 你所能做的是实现 onRetainNonConfigurationInstance() 返回一个对象随身携带 数据然后检索数据时,你的活动再次开始用 getLastNonConfigurationInstance() 。 例如:

@Override
public Object onRetainNonConfigurationInstance() {
    final MyDataObject data = collectMyLoadedData();
    return data;
}
注意: 虽然您可以返回任何对象,你 决不应该通过一个对象绑定到吗 活动 ,比如 可拉的 , 适配器 , 视图 或任何其他对象的关联到一个 上下文 。 如果你这样做,它会 泄漏的所有视图和资源原始活动实例。 (泄漏资源 意味着你的应用程序维护一个抓住他们,他们不能被垃圾收集,所以 大量的记忆也会失去。)

然后检索数据时,你的活动重新开始:http://www.633816332.com/

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
    if (data == null) {
        data = loadMyData();
    }
    ...
}
在这种情况下, getLastNonConfigurationInstance() 返回数据 救了 onRetainNonConfigurationInstance() 。 如果 数据 是null (这发生在当活动开始由于任何原因除了一个配置更改),那么 这段代码加载数据对象从原来的源代码。

处理配置改变自己(http://www.jiangjieedu.com/List.aspx?coid=98 )
如果您的应用程序不需要更新资源在一个特定的配置 改变 和 你有一个性能限制,需要你 避免活动重启,那么你可以声明你的activity来处理配置的变化 本身,避免系统重启你的activity。

注意: 处理配置改变自己可以让你更 更难使用替代资源,因为系统不会自动应用它们 给你。 这种技术应该被视为最后当你必须避免重启因 配置更改,不建议大多数应用程序。

为了声明你的activity来处理配置的变化,编辑适当的 <活动> 元素 你的manifest文件来包含 android:configChanges 属性的值与代表配置你想 处理。 可能的值中列出的文档 android:configChanges 属性(最常用的值 “定位” 到 防止重启当屏幕的方向变化和 “keyboardHidden” 防止 重新启动键盘可用性改变时)。 你可以声明多个配置值 通过将它们的属性与一个管 | 字符。

例如,下面的清单代码声明了一个活动,同时处理 屏幕的方向变化和键盘的可用性的改变:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">
现在,当这些配置中的一个变化, MyActivity 不重启。 相反, MyActivity 接收调用 onConfigurationChanged() 。 这种方法 传递一个 配置 对象,它指定 这个新设备的配置。 通过阅读领域 配置 , 您可以确定新配置并进行适当的修改通过更新 接口中使用的资源。 在 这个方法被调用,你的活动的 资源 对象被更新 返回资源基于新的配置,所以你可以很容易的 重置您的UI元素没有系统重启你的activity。

注意: 从Android 3.2(API级别13), 这个 “屏幕大小”也在改变 当设备切换不同的肖像和景观 取向。 因此,如果你想阻止运行时重新启动时由于取向变化发展 13级或更高的API(如声明的 minSdkVersion 和 targetSdkVersion 属性),您必须包括 “screenSize” 价值除了 “定位” 值。 也就是说,您必须decalare android:configChanges = "取向| screenSize” 。 然而,如果你的应用程序目标API级别 12或更低,那么你的activity总是处理这个配置变化本身(这个配置 改变不重启你的activity,即使运行在Android 3.2或更高的设备)。

例如,下面的 onConfigurationChanged() 实现 检查当前设备的方向:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
这个 配置 对象代表着当前所有的 配置,而不只是那些改变。 大多数时候,你不会关心究竟如何 配置已经改变,并且可以简单地重新分配你所有的资源,提供替代品 配置,你处理。 例如,因为 资源 对象现在已更新,您可以重置 任何 ImageView 年代 setImageResource() 和适当的资源,为新的配置是使用(所描述的那样 提供资源 )。

注意,这个值 配置 字段是整数,匹配特定的常量 从 配置 类。 对于文档中的那个常量 每个字段使用,请参考适当的字段 配置 参考。

回复列表 (共1个回复)

沙发

雨滴会变成咖啡,种子会开出玫瑰,旅行是一种约会,离别是为体会寂寞的滋味,不是没人陪,只怪咖啡喝不醉,一路走就累,雨一碰就碎,只有你依然完美。[url=http://www.kh025.com]南京旅行社[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册