您的位置:首页 > 移动开发 > Android开发

Android 系列 2.4用户旋转设备时保留数据

2017-01-06 10:02 281 查看
2.4用户旋转设备时保留数据

问题

当用户旋转设备时,Android通常会销毁并重新创建当前活动。您希望在此周期中保留一些数据,但活动中的所有字段都会丢失。



有几种方法。如果所有数据都包含原始类型,包含String s或Serializable,则可以将其保存在传递的Bundle中的onSaveInstanceState()中。

另一个解决方案允许您返回一个任意对象。您只需要覆盖您的活动中的onRetainNonConfigurationInstance()以保存一些值;在onCreate()的结尾处调用getLastNonConfigurationInstance()以查看是否存在先前保存的值,如果是,则相应地分配字段。

讨论

使用onSaveInstanceState()

使用onRetainNonConfigurationInstance()

getLastNonConfigurationInstance()方法的返回类型是Object,所以你可以返回任何你想要的值。您可能想创建一个Map或写一个内部类来存储值,但是通常只需传递对当前活动的引用就更容易了,例如,使用:

/ **返回任意单个令牌对象,以保持整个企业的销毁和重新创建。

* /

@覆盖

public Object onRetainNonConfigurationInstance(){

返回这个;

}}

当Android破坏您的主要活动时,将调用上述方法。假设您想保留对正在由正在运行的服务更新的另一个对象的引用,该对象由活动中的字段引用。还可能有一个布尔值来指示服务是否处于活动状态。在上面的代码中,我们返回一个对活动的引用,从中可以访问它的所有字段(甚至是私有字段,因为传出和传入的Activity对象是相同的类)。在我的地理跟踪应用程序JPSTrack,例如,我有一个FileSaver类接受来自位置服务的数据;我希望它不断获取位置,并保存到磁盘,尽管旋转,而不是每次屏幕旋转重新启动它。如果您的设备固定在汽车仪表盘上(我们希望),则旋转是不太可能的,但很可能是在乘客或行人在地理跟踪时拍摄照片或输入笔记。

Android创建新实例后,它调用onCreate()以通知新实例已创建它。在onCreate()中,通常会执行构造函数操作,例如初始化字段和分配事件侦听器。那么,你仍然需要做那些,所以留下他们。然而,接近onCreate()的结尾,你将添加一些代码来获取旧的实例,如果有的话,并从中获取一些重要的字段。代码应该像例2-3。

实施例2-3。 onCreate方法

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

saving = false;

paused = false;

// lots of other initializations...

// Now see if we just got interrupted by e.g., rotation

Main old = (Main) getLastNonConfigurationInstance();

if (old != null) {

saving = old.saving;

paused = old.paused;

// this is the most important line: keep saving to same file!

fileSaver = old.fileSaver;

if (saving) {

fileNameLabel.setText(fileSaver.getFileName());

}

return;

}

// I/O Helper

fileSaver = new GPSFileSaver(...);

}

fileSaver对象是一个大的,我们想要保持运行,而不是每次都重新创建。 如果我们没有一个旧的实例,我们只在onCreate()的最后创建fileSaver,因为否则我们将创建一个新的,只是替换旧的,这是至少对性能 。 当onCreate()方法完成时,我们不保留对旧实例的引用,因此它应该适用于Java GC。 最终的结果是,尽管重新创建,活动似乎保持运行良好的屏幕旋转。

另一种可能性是在AndroidManifest.xml中设置android:configChanges =“orientation”,但这种方法有点冒险。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息