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

来源:互联网 发布:个人所得税申报的软件 编辑:程序博客网 时间:2024/05/02 02:25

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”,但这种方法有点冒险。

0 0
原创粉丝点击