Android: 我应该传入可序列化对象还是从 Bundle 重新创建对象?

Android: Should I pass in serializable or recreate the object from Bundle?

所以我有一个默认实现可序列化的 Calendar obj,我想将它传递到一个包中,以便它的值在屏幕旋转时保存。

我应该将其作为可序列化对象传递还是提取值并重新创建 obj 以提高效率?

bundle.putSerializable("key", calendar);

bundle.putInt("dayKey", calendar.get(Calendar.DAY_OF_MONTH));
bundle.putInt("monthKey", calendar.get(Calendar.MONTH));
bundle.putInt("yearKey", calendar.get(Calendar.YEAR));

不推荐在Android中使用Serializable;请改用 Parcelable

我猜这取决于 Object 的大小以及手动重新创建的麻烦程度。

老实说,虽然 Parcelable 绝对是首选的序列化方法,但我认为对于这种情况,您只需将其作为 Serializable 额外添加即可。考虑到重新创建 Activity 的工作量,我认为序列化 Calendar 实例的费用可以忽略不计。

如果不出意外,它会使您的代码更易于维护和简洁。

选择 Parcelable 而不是 Serializable。如果性能很重要,Parcelable 可能会快 10 倍左右 (http://www.developerphil.com/parcelable-vs-serializable/)

此外,您可以使用 https://github.com/johncarl81/parceler 来避免生成(和维护!)所有本来会存在的样板代码。

@Parcel
public class Person {
  ...
}

Parcelable parcelable = Parcels.wrap(new Person(..));
Person = Parcels.unwrap(parcelable);
  • onSaveInstanceState 方法用于商店 Activity 的状态。当 activity 您 旋转屏幕 按主页按钮 或打开新的 activity 时调用来自通知栏.
  • 它在 onPause() 方法之后调用。
  • 您可以将自定义对象或任何原始数据类型(即称为 Activity 的状态)保存为

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);        
        outState.putSerializable(KEY_CALENDAR, cal);        
    }
    
  • onRestoreInstanceState() 方法用于恢复 Activity 的状态。

  • 在onStart()方法之后调用

  • 你可以像

    一样恢复Activity的状态
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);       
        cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
    }
    

    这里可以使用serializable来保存Activity的状态。

  • 您也可以使用 onCreate() 方法来恢复您保存的状态,因为 bundle 在 onCreate() 和 onRestoreInstanceState() 两种方法中交付是相同的,例如

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
    
        if(savedInstanceState != null) {
            cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
        } else {
            cal = Calendar.getInstance();
            cal.setTime(new Date());    
        }
    }