【发布时间】:2012-08-11 11:26:34
【问题描述】:
假设我有两个活动,活动 1 和活动 2。 我想从活动 1 导航到活动 2,从活动 2 获取一些信息并将其插入活动 1,而且我不想在离开时丢失活动 1 的先前状态。 我怎样才能保存它的状态?
【问题讨论】:
标签: android android-activity onresume onpause
假设我有两个活动,活动 1 和活动 2。 我想从活动 1 导航到活动 2,从活动 2 获取一些信息并将其插入活动 1,而且我不想在离开时丢失活动 1 的先前状态。 我怎样才能保存它的状态?
【问题讨论】:
标签: android android-activity onresume onpause
您所描述的是使用Activity.startActivityForResult() 方法的完美经典理由。
这是谷歌在这个方法文档中写的:
启动一项您希望在完成后获得结果的活动。当此活动退出时,您的 onActivityResult() 方法将使用给定的 requestCode 调用
所以你应该做的是:从你的活动1开始活动的结果,从活动2使用setResult(int resultCode, Intent data)方法和你希望你的活动1取回的数据,并调用finish()(它会回到@ 987654324@ 在同一状态活动1之前..)。
【讨论】:
在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);
}
}
【讨论】:
如果您只想在运行时保持数据活动,请考虑使用静态成员。然后,您可以从任何活动中访问和操作这些成员。例如:
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函数,让它更安全、更优雅。
如果您想存放更长时间,请考虑使用:
【讨论】:
用户在您的应用中执行一项操作以启动新活动。创建第二个活动时,当前活动将停止。如果用户随后按下返回按钮,则重新启动第一个活动。
当您的活动停止时,活动对象会一直驻留在内存中,并在活动恢复时被调用。您不需要重新初始化在导致 Resumed 状态的任何回调方法期间创建的组件。系统还会跟踪布局中每个 View 的当前状态,因此如果用户在 EditText 小部件中输入文本,则该内容会被保留,因此您无需保存和恢复它。
注意:即使系统在停止时销毁了您的 Activity,它仍然会在 Bundle(一个键值对对)并在用户导航回活动的同一实例时恢复它们。
CommonsWare here 说:
当用户“按下 BACK 按钮”时,Bundle 从 onSaveInstanceState() (如果有的话)被丢弃,正如用户所指出的 他们完成了活动。 onSaveInstanceState() 包 在用户没有说他们完成的情况下使用 活动(例如,他们接听了来电)但 Android 选择销毁活动以释放 RAM。
文档说:
请注意,在 onPause() 中保存持久数据很重要 onSaveInstanceState(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
【讨论】: