2013-01-12 12 views
1

我正在制作我的第一个Android应用程序,它由editText和Spinner组成。阅读活动周期,我想知道是否有必要在我的情况下使用Bundle机制。在Android中处理运行时更改的简单应用程序 - 我需要使用Bundle吗?

由于小部件自动持久的状态 - 可能我只是呼吁在EditText上的微调器和gettext的()的getSelectedItem()方法onCreate()方法中的活动和传递到我的新重新创建模型对象而不是使用Bundle机制?这种方法的优点和不足之处是什么?

回答

1

小部件的状态不会自动持续存在。当你的活动被破坏时,它会丢失关于状态的所有信息。我建议你使用共享首选项保存你的应用程序状态。这里是一个来自谷歌developers site的例子。它允许你通过存储键值对来保存你的应用程序状态,它应该足够你的应用程序。

当您的活动停止时,将共享首选项中的文本和微调项目位置保存 - onStop()并恢复onCreate()中的状态。

public class Calc extends Activity { 
    public static final String PREFS_NAME = "MyPrefsFile"; 

    @Override 
    protected void onCreate(Bundle state){ 
     super.onCreate(state); 
     . . . 

     // Restore preferences 
     SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     boolean silent = settings.getBoolean("silentMode", false); 
     setSilent(silent); 
    } 

    @Override 
    protected void onStop(){ 
     super.onStop(); 

     // We need an Editor object to make preference changes. 
     // All objects are from android.context.Context 
     SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putBoolean("silentMode", mSilentMode); 

     // Commit the edits! 
     editor.commit(); 
    } 
} 

尽管可以通过onSaveInstanceState(Bundle)方法保存应用程序状态,通常是更好的方式将做,在onPause()onStop()方法(该数据将被保存肯定)。文件说:

注意,它保存的onPause()的onSaveInstanceState(捆绑),因为后者不是 生命周期回调的一部分,而不是 持久性数据是很重要的,所以不会在任何情况下如被称为其文档中描述的 。

+0

这看起来不太合适--Android文档特别提到了在类似屏幕旋转的事件发生时,在activity上调用onDestroy()方法。从一个简单的测试中,我们可以看到这些小部件在没有编码的情况下保持其状态,这也在文档中提到。你的意思是坚持通过销毁应用程序对象?我不确定我需要这样做。 –

+0

是的,我的意思是如果您需要在应用程序对象被销毁时保存状态。在你的情况下,Android在它自己改变方向时使用bundle机制,所以不需要使用Bundle来保持状态。或者,也许我错了,重新创建模型对象意味着什么? –

+0

呃现在我很困惑,文档说使用onSaveInstanceState(Bundle)方法来保存活动的瞬态(UI的状态)。这让我回到了我原来的问题 - 为什么我不能在onCreate()方法中读取小部件的状态?我想我应该尝试一下,看看会发生什么。 –

相关问题