3

假设我有两个活动,活动 1 和活动 2。我想从活动 1 导航到活动 2,从活动 2 获取一些信息并将其插入活动 1,而且我不想在离开时丢失活动 1 的先前状态。我怎样才能保存它的状态?

4

5 回答 5

4

您所描述的是使用该Activity.startActivityForResult()方法的完美经典理由。

这是谷歌在这个方法文档中写的:

启动一项您希望在完成后获得结果的活动。当此活动退出时,您的 onActivityResult() 方法将使用给定的 requestCode 调用

所以你应该做的是:从你的activity1开始活动的结果,并从activity2使用setResult(int resultCode, Intent data)你希望你的activity1返回的数据的方法,然后调用finish()(它将回到onActivityResult()activity1之前的相同状态..) .

于 2012-08-11T12:06:20.857 回答
2

覆盖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);
    }
}
于 2012-08-11T12:01:41.783 回答
0

你应该覆盖onSaveInstanceState(Bundle savedInstanceState)

请检查答案以获取示例代码

或使用SharedPreferences. 检查代码

于 2012-08-11T11:43:48.327 回答
0

用户在您的应用程序中执行启动新活动的操作。创建第二个活动时,当前活动将停止。如果用户随后按下返回按钮,则重新启动第一个活动。

当您的活动停止时,活动对象将保留在内存中,并在活动恢复时被调用。您不需要重新初始化在导致 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 对象,如果你有任何其他可以使用的状态preferencesfile或者sqlite将它们保存onPause()并检索它们onResume()

您可以在这些页面中查看更多详细信息:
停止和重新启动 Activity
保存 Android 中的 Activity 状态
Android 不会保存 Activity 的当前状态

于 2012-08-11T12:30:32.203 回答
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 函数以使其更安全、更优雅。

如果您想存放更长时间,请考虑使用:

于 2012-08-11T12:04:38.100 回答