`
ericbaner
  • 浏览: 177556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android Configuration 变换时如何保持珍贵数据不被摧毁

 
阅读更多

以下文字来源于andoid SDK上一篇文章的大概翻译:

 

当你的应用里显示了一堆数据,这些数据又是开销较大获取的, 在configuration变换如键盘弹出隐藏,横竖屏切换,语言变换等出现时,系统自动的Activity destroy/creation 机制可能会导致非常不好的用户体验。 比如如下的例子,一个简单的Fclikr浏览应用,其从网上下载你账户里的图片。

 

 

 

 

如上述横竖屏切换时,如果不做特殊处理,android会自动处理 configuration变换事件,但是, 这样的话应用如果重新下载要显示的图片,用户体验该是多么糟糕。 明显的解决这个问题的办法是cache一下这些图片。 可以cahce这些图片到 SD card里(如果有的话), 或在应用程序的数据对象里, 或在静态数据里等等。 不过前述这些方法都不太适合于这个问题:

为什么我们要有开销来cache这些图片当屏幕没有横竖屏切换?

 

幸运的是,Android提供了一个极好的API, 用来处理这个问题。

 

Activity 类有一个特别的方法,叫 onRetainNonConfigurationInstance() . 该方法可以用来传递一个任意的对象, 你的应用可以在将来需要时调用此方法。 在上面的应用里,可以将下载的图片通过此接口传递。实现类似如下:

 

@Override
public Object onRetainNonConfigurationInstance() {
    final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
    keepPhotos(list);
    return list;
}

 

在横竖切换后,新创建的Activity里的onCreate函数,你要做的是是将你的对象取回来,通过getLastNonConfigurationInstance() 接口。

 

private void loadPhotos() {
    final Object data = getLastNonConfigurationInstance();
    
    // The activity is starting for the first time, load the photos from Flickr
    if (data == null) {
        mTask = new GetPhotoListTask().execute(mCurrentPage);
    } else {
        // The activity was destroyed/created automatically, populate the grid
        // of photos with the images loaded by the previous activity
        final LoadedPhoto[] photos = (LoadedPhoto[]) data;
        for (LoadedPhoto photo : photos) {
            addPhoto(photo);
        }
    }
}

 

要注意的是, 传递给onRetainNonConfigurationChange() 的对象,不能是跟Activity/Context有关联的, 否则将会有内存泄露所有跟Activity相关联的view和resource。 也即意味着,你不能传递如View, Drawable, Adapter 等等对象。上述应用传递的是图片bitmap本身,而不是drawable.  最后,还是注意的是,你应该仅用该接口传递较“珍贵”的数据(重新获取代价较大)。

 

 

另外,SDK中还有说明如下:

 

该 接口仅供优化调用,你不能仅仅依靠此接口。 当其被调用时,有一系列保证措施会用来帮助优化configuration切换:

1) 接口将在onStop()和onDestroy()之间调用。

2) 一个新的Activity的实例一般会立即生成,在当前Activity的onDestory()被调用后。 特别是,在这段时间没有消息会被分发(返回的对象没有关联于一个activity).

3) 返回的对象一般将在接下来系统自动重新的Activity实例里通过getLastNonConfigurationInstance() 接口获得。

 

这些保证设计用来使一个activity可以将扩展的状态从旧的activity传递到新的activity实例,包括加载的图片,网络连接对象,甚至是正在运行的线程对象。 注意不要传递任何将根据configuration变换的对象,如 对resource里读取的string, layout, drawable等。



分享到:
评论

相关推荐

    Android应用源码之Configuration_Configuration.zip

    当我们谈论Android的Configuration时,首先要知道它是如何影响应用的。当设备的配置发生改变(如屏幕旋转、系统语言切换),Android系统会通知正在运行的Activity,这可能导致Activity的生命周期方法如...

    Android应用源码之Configuration.zip

    当我们谈论"Android应用源码之Configuration.zip"时,我们可以深入探讨以下几个核心知识点: 1. **Configuration类**: `Configuration`是Android系统用来存储和传递设备配置信息的类,它包含了屏幕方向、字体大小...

    Android如何动态调整应用字体大小详解

    在 Android 系统中,字体大小的变化是由 `android.content.res.Configuration` 类中的 `fontScale` 控制的。因此,要实现应用字体大小的动态调整,我们需要修改 `fontScale` 为我们自己设置的数值。 为了实现应用...

    安卓Android BLE低功耗蓝牙接受数据详解 只需100行代码轻松搞定

    7. **断开连接**:在不需要再接收数据时,记得调用`BluetoothGatt.disconnect()`来释放资源。 以下是一个简化的代码示例: ```java BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner(); ...

    Android 屏幕颜色的变换源码.zip源码资源下载

    总之,这份"Android 屏幕颜色的变换源码"涵盖了Android UI编程的多个重要方面,包括颜色处理、主题切换、事件响应、数据持久化和系统交互,对于提升Android开发技能非常有帮助。通过深入学习和实践这些代码,开发者...

    Android 销毁当前的Activity

    让 Android 横竖屏切换时不销毁当前的 Activity 需要使用 `android:configChanges` 属性和 `onConfigurationChanged` 方法。同时,我们也需要正确处理屏幕方向的改变,以确保应用程序的正确运行。

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    然而,在使用Fragment时,有时会出现一个问题:当Activity由于配置更改(如屏幕旋转)等原因需要重建(recreate)时,内嵌的Fragment可能会被不正确地添加多次,导致界面重叠。这个问题通常与如何管理和恢复Fragment...

    Android 屏幕颜色的变换源码.rar

    在Android开发中,屏幕颜色的变换是一个涉及到用户体验和界面设计的重要方面。这个压缩包"Android 屏幕颜色的变换源码.rar"包含了相关的代码示例,可能是为了展示如何动态地改变Android应用的屏幕颜色或者调整色彩...

    cm canopen configuration studio

    7. **故障排查**:当网络出现问题时,CM CANOpen Configuration Studio提供了一些诊断工具,帮助用户定位和解决通信问题。 CmCopConfig_2_2可能是该软件的版本2.2,可能包含了一些更新和改进,比如增强的稳定性、新...

    android maven

    Android Maven插件使得Android开发者可以利用Maven的这些功能,同时保持与Android Studio的兼容性。 **一、Android Maven插件的安装与配置** 1. 在你的`pom.xml`文件中,你需要定义Android插件和相关的配置信息。...

    org.apache.commons.configuration.XMLConfiguration的读取范例

    在这个范例中,我们将深入探讨如何使用 `XMLConfiguration` 类来读取XML配置文件,并从中提取数据。 XML配置文件是一种常见的存储应用程序设置的方式,因为它们结构清晰,易于人类阅读和编辑。`XMLConfiguration` ...

    Android-logback-android用于Android的可靠通用快速和灵活的日志记录框架

    `logback-android`是专门为Android系统优化的Logback实现,避免了对Android系统的Dalvik VM不兼容问题。与标准的Logback相比,它去除了对Java EE特定部分的依赖,使得它可以在Android环境中无缝运行。此外,它还提供...

    解决Wireless Zero Configuration服务不能自动启动

    解决Wireless Zero Configuration服务不能自动启动 Wireless Zero Configuration服务是一个支持无线上网的服务,如果该服务停止,则无法找到无线网络。很多笔记本装完系统,上好无线网卡驱动后可以使用无线网络功能...

    Android应用内设置多语言

    所以跟随系统时查看系统语言单独调用,如果本地string中不存在系统语言对应的语言,那么默认为英语 ———————————————— 博客地址:https://blog.csdn.net/lou_liang/article/details/126390461

    apache commons configuration 学习

    Apache Commons Configuration 还支持动态更新配置,这意味着在程序运行时可以修改配置文件并立即反映到 `Configuration` 对象中。这在需要根据用户需求或环境变化动态调整配置的场景中非常有用。 在配置文件 `...

    Android应用源码之(横竖屏切换处理-IT计算机-毕业设计.zip

    **自定义处理**:设置`android:configChanges="orientation"`或`android:configChanges="screenOrientation"`,当屏幕方向改变时,系统会调用`onConfigurationChanged(Configuration newConfig)`方法,让你在不销毁...

    Android基础教程PPT

    在Android开发领域,掌握基础是至关重要的。这篇“Android基础教程PPT”旨在引导初学者了解如何使用Eclipse环境进行Android应用开发。首先,我们从创建或导入Android工程开始。 要开启一个新的Android工程,你需要...

    Fragment的使用,隐藏显示以及androidPad横竖屏切换

    默认情况下,当设备旋转时,系统会重新创建Activity和其中的所有Fragment,导致数据丢失。为了避免这种情况,可以在AndroidManifest.xml中为相应Activity设置`android:configChanges="orientation|screenSize"`,...

    Wi-Fi_Simple_Configuration_Technical_Specification_v2.1_0

    Wi-Fi Simple Configuration(WSC),也被称为Wi-Fi Protected Setup(WPS),是一种标准的认证协议,旨在降低家庭和小型企业网络中设置新Wi-Fi设备的复杂性。它通过使用PIN码、物理按钮或近场通信(NFC)等方式,...

    Altera EPCS Configuration Device protel99se库

    4. **安全特性**:EPCS设备通常具备安全特性,如防止非法重配置和保护配置数据不被窃取。设计者可以根据具体需求启用这些特性。 5. **库文件使用**:在Protel99SE中,库文件包含了Altera EPCS Configuration Device...

Global site tag (gtag.js) - Google Analytics