假设我有两个活动,activity1和activity2。 我想从activity1导航到activity2,从activity2获取一些信息并将其插回到activity1,我也不想在我离开时丢失activity1之前的状态。 我该如何保存其状态?
答案 0 :(得分:4)
您所描述的是使用Activity.startActivityForResult()
方法的完美经典理由。
这是谷歌在这个方法文档中写的:
在完成后启动您想要结果的活动。当此活动退出时,将使用给定的requestCode
调用onActivityResult()方法
所以你应该做的是:从你的activity1开始活动结果,从activity2使用setResult(int resultCode, Intent data)
方法和你想让你的activity1回来的数据,然后调用finish()
(它会回到onActivityResult()
之前的相同状态,活动1之前......)。
答案 1 :(得分:2)
覆盖activity1
中的onSaveInstanceState(Bundle)
以保存您想要的任何数据,然后在同一活动中覆盖onRestoreInstanceState(Bundle)
以获取值。使用Bundle
,您可以存储几乎所有您想要的数据。我推荐这样的东西:
public class MainActivity extends Activity {
...
public static final String DATA1_KEY = "data1";
private boolean value1;
...
@Override
protected void onSaveInstanceState (Bundle outState) {
outState.putBoolean(DATA1_KEY, value1);
}
@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
value1 = savedInstanceState.getBoolean(DATA1_KEY);
}
}
答案 2 :(得分:0)
答案 3 :(得分:0)
如果您希望仅在运行时保持数据存活,请考虑使用静态成员。然后,您可以从任何活动中访问和操纵这些成员。例如:
public class FirstActivity extends Activity
{
public static String data = null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
data = "This is a test!";
}
}
从第二个活动中,您可以访问这些静态变量,例如
public class SecondActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
if(FirstActivity.data!=null)
{
//You can use it:
System.out.println(FirstActivity.data);
}
}
}
当然,您可以添加getter / setter函数,使其更安全,更优雅。
如果您想将它们存放较长时间,请考虑使用:
答案 4 :(得分:0)
用户在您的应用中执行启动新活动的操作。创建第二个活动时,将停止当前活动。如果用户然后按“返回”按钮,则重新启动第一个活动。
当您的活动停止时,Activity对象将保留在内存中,并在活动恢复时被调用。您不需要重新初始化在任何导致Resumed状态的回调方法期间创建的组件。系统还会跟踪布局中每个视图的当前状态,因此,如果用户在EditText小部件中输入文本,则会保留该内容,因此您无需保存和还原它。
注意:即使系统在停止时销毁了活动,它仍然会保留Bundle中的View对象(例如EditText中的文本)的状态(一个键值的blob)如果用户导航回活动的同一个实例,则恢复它们 CommonsWare here说:
当用户“按下BACK按钮”时,然后是Bundle onSaveInstanceState()(如果有)被丢弃,如用户指示的那样 他们完成了活动。 onSaveInstanceState()Bundle 用于用户尚未说完的情况 活动(例如,他们接受了来电)但Android 选择销毁活动以释放RAM。
文档说:
请注意,将持久数据保存在onPause()中非常重要 ofSaveInstanceState(Bundle)因为后者不属于 生命周期回调,因此不会在每种情况下调用 在其文档中描述。
换句话说,将非View对象的保存/恢复代码放在onPause()和onResume()中,而不是onSaveInstanceState(Bundle)和onRestoreInstanceState(Bundle)。最后我想你不需要如果您只有View对象,则保存任何状态,如果您有任何其他状态,则可以使用preferences
,file
或sqlite
将其保存在onPause()
和在onResume()
中撤回他们。
您可以在这些页面中看到更多详细信息:
Stopping and Restarting an Activity
Saving Activity state in Android
Android wont save the current state of an activity