Android_onRetainNonConfigurationInstance和getLastNonConfigurationInstance

转自:http://gundumw100.iteye.com/blog/1160585 

Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。 

    当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。 

    用这个方法保存Activity State后,通过getLastNonConfigurationInstance()在新的Activity Instance中恢复原有状态。比如: 

Java代码  收藏代码
  1. @Override  
  2. public Object onRetainNonConfigurationInstance() {  
  3.     final MyDataObject data = collectMyLoadedData();  
  4.     return data;  
  5. }  


在恢复窗口时,我们可以不使用onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如 

Java代码  收藏代码
  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.main);  
  5.   
  6.     final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();  
  7.     if (data == null) {  
  8.         data = loadMyData();  
  9.     }  
  10.     ...  
  11. }  



这个方法最大的好处是: 
    * 当Activity曾经通过某个资源得到一些图片或者信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。 
    * 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。 
    * 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。 

下边是需要特别注意的几点: 
    * onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用。 
    * 调用顺序同样介于onStop() 和 onDestroy()之间。

posted on 2011-11-14 16:59  dengxian.zhi  阅读(3580)  评论(0编辑  收藏  举报

导航