假设我有两个活动,活动 1 和活动 2。我想从活动 1 导航到活动 2,从活动 2 获取一些信息并将其插入活动 1,而且我不想在离开时丢失活动 1 的先前状态。我怎样才能保存它的状态?
5 回答
您所描述的是使用该Activity.startActivityForResult()
方法的完美经典理由。
这是谷歌在这个方法文档中写的:
启动一项您希望在完成后获得结果的活动。当此活动退出时,您的 onActivityResult() 方法将使用给定的 requestCode 调用
所以你应该做的是:从你的activity1开始活动的结果,并从activity2使用setResult(int resultCode, Intent data)
你希望你的activity1返回的数据的方法,然后调用finish()
(它将回到onActivityResult()
activity1之前的相同状态..) .
覆盖onSaveInstanceState(Bundle)
以activity1
保存您想要的任何数据,然后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);
}
}
用户在您的应用程序中执行启动新活动的操作。创建第二个活动时,当前活动将停止。如果用户随后按下返回按钮,则重新启动第一个活动。
当您的活动停止时,活动对象将保留在内存中,并在活动恢复时被调用。您不需要重新初始化在导致 Resumed 状态的任何回调方法期间创建的组件。系统还会跟踪布局中每个视图的当前状态,因此如果用户在 EditText 小部件中输入文本,则该内容会保留,因此您无需保存和恢复它。
注意:即使系统在停止时破坏了您的活动,它仍会在 Bundle(键值对的 blob)中保留 View 对象(例如 EditText 中的文本)的状态,并在用户导航返回时恢复它们到同一个活动实例。
CommonsWare这里说:
当用户“按下 BACK 按钮”时,来自 onSaveInstanceState()(如果有)的 Bundle 将被丢弃,因为用户已指示他们已完成活动。onSaveInstanceState() Bundle 用于用户尚未说他们完成活动(例如,他们接受了来电)但Android 选择销毁活动以释放RAM 的情况。
文件说:
请注意,将持久数据保存在 onPause() 而不是 onSaveInstanceState(Bundle) 中很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。
换句话说,将非 View 对象的保存/恢复代码放在 onPause() 和 onResume() 中,而不是 onSaveInstanceState(Bundle) 和 onRestoreInstanceState(Bundle) 中。最后我猜你不需要保存任何状态,如果你只有 View 对象,如果你有任何其他可以使用的状态preferences
,file
或者sqlite
将它们保存onPause()
并检索它们onResume()
。
您可以在这些页面中查看更多详细信息:
停止和重新启动 Activity
保存 Android 中的 Activity 状态
Android 不会保存 Activity 的当前状态
如果您只想在运行时保持数据活动,请考虑使用静态成员。然后,您可以从任何活动中访问和操作这些成员。例如:
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 函数以使其更安全、更优雅。
如果您想存放更长时间,请考虑使用: