使用onResume和onPause

时间:2012-08-11 11:26:35

标签: android android-activity onresume onpause

假设我有两个活动,activity1和activity2。 我想从activity1导航到activity2,从activity2获取一些信息并将其插回到activity1,我也不想在我离开时丢失activity1之前的状态。 我该如何保存其状态?

5 个答案:

答案 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)

您应该覆盖onSaveInstanceState(Bundle savedInstanceState)

请查看this答案,了解示例代码

或使用SharedPreferences。查看this代码

答案 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对象,则保存任何状态,如果您有任何其他状态,则可以使用preferencesfilesqlite将其保存在onPause()和在onResume()中撤回他们。

您可以在这些页面中看到更多详细信息:
Stopping and Restarting an Activity
Saving Activity state in Android
Android wont save the current state of an activity