使用哪一个:onSaveInstanceState与onRetainNonConfigurationInstance?

Raj*_*Raj 36 android

据我所知,onRetainNonConfigurationInstance是一个冗余回调.如果我的活动有非常昂贵的初始化,我最好使用onSaveInstanceState.保存的实例比非配置实例包含更多情况.使用一个API与另一个API有什么指导原则吗?谢谢.

Com*_*are 48

据我所知,onRetainNonConfigurationInstance是一个冗余回调.

不它不是.

如果我的活动有非常昂贵的初始化,我最好使用onSaveInstanceState.

onSaveInstanceState()不是为"真正昂贵的初始化"而设计的.它是专为"嘿,用户对活动中的信息进行了一些更改但尚未保存它,让我们不丢失那些数据,m'kay?".

使用一个API与另一个API有什么指导原则吗?

如果它适合a Bundle并且不是太大,请使用onSaveInstanceState().所有不适合Bundle(例如,插座)或非常大的(例如,照片作为a Bitmap)应该使用onRetainNonConfigurationInstance(),并且您的应用程序应该在需要时重新创建这些项目.

  • @Raj:不,不会.这两种方法有不同的作用.`onSaveInstanceState()`恰好用于配置更改.它也恰好用于Android想要终止应用程序进程以释放RAM的情况,但用户仍然可以返回活动(例如,通过BACK按钮).这就是为什么Android使用`Bundle` - 它可以转换成`byte []`并跨越进程边界传送.Android保持`byte []`直到需要它为止,或直到活动不再通过BACK访问. (6认同)
  • @Raj:但是,由于`Bundle`(或任何`onSaveInstanceState()`需要使用)需要跨进程边界传输,我们仍然缺乏处理我们想要保留的配置更改的方法但是它们自己不能去进入一个`Bundle`,就像一个socket.为此,有一个`onRetainNonConfigurationInstance()`,它只用于进程将*不被终止的情况,因此我们可以将任意对象从旧活动实例传递给新活动实例. (6认同)
  • 我的看法是,onSaveInstanceState()允许在长期持久存储中保存简单的可序列化数据.即使在应用程序进程被终止后,也可以在以后检索此数据.相比之下,onRetainNonConfigurationInstance()允许您保存任何Java对象,并假设这些对象将被新活动实例立即重用.因此,可以保存AsyncTask和SQLiteDatabse等项目.这里的关键是使用应用程序而不是活动上下文创建这些对象.否则,被破坏的活动可能无法被垃圾收集. (4认同)