【问题标题】:How to maintain the previous state of an activity如何保持活动的先前状态
【发布时间】:2012-02-05 08:36:33
【问题描述】:

我有两个活动(活动 1 和活动 2),每个活动都有一个按钮。在活动 1 中,我有一个选项很少的微调器。假设我正在从此微调器中选择选项 2,并且我正在单击活动 1 中的按钮,然后活动 2 开始。当我单击后退按钮时,activity1 恢复并且相同的选项 2 可见(就像我需要的那样)。现在的问题是,如果我的 activity2 已启动并且我单击其中的一个按钮,则 activity1 将启动。但是,它不是恢复之前的 activity1 状态,而是以刚刚创建的方式开始,并且更改了之前的选择。即使我再次开始活动,我如何才能获得与返回按钮相同的功能(不是返回上一个活动的功能,我的意思是自动恢复任何活动的上一个状态)。如果再次访问,我只需要知道如何保持活动的先前状态。

使用此代码,当单击按钮时,我会从一个活动转到另一个活动:

Intent intent=new Intent();
intent.setClassName(getApplicationContext(),"com.myapp.activityname");

startActivity(intent);

请帮助我。我是android的初学者,所以如果有人给出答案,请解释一下。提前感谢

【问题讨论】:

标签: android android-intent


【解决方案1】:

我想我找到了答案。让我用简单的话来说一下我做了什么,

假设我有两个活动活动 1 和活动 2,我正在从活动 1 导航到活动 2(我在活动 2 中做了一些工作),然后通过单击活动 1 中的按钮再次返回活动 1。现在在这个阶段,我想回到活动 2,我想看到我的活动 2 与我上次离开活动 2 时的状态相同。

对于上述场景,我所做的是在清单中我做了一些这样的更改:

<activity android:name=".activity2"
          android:alwaysRetainTaskState="true"
          android:launchMode="singleInstance">
</activity>

并且在按钮点击事件上的activity1中我做了这样的事情:

Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClassName(this,"com.mainscreen.activity2");
startActivity(intent);

在按钮点击事件的activity2中,我做了这样的事情:

Intent intent=new Intent();
intent.setClassName(this,"com.mainscreen.activity1");
startActivity(intent);

现在会发生的是,我们在activity2中所做的任何更改都不会丢失,并且我们可以在与之前离开时相同的状态下查看activity2。

我相信这就是答案,这对我来说很好。

【讨论】:

  • 请停止一遍又一遍地发布这个答案。如果您发现重复的问题,请将它们标记为此类。
【解决方案2】:

通过覆盖 Activity 的 onSaveInstanceState 事件处理程序,您可以使用其 Bundle 参数来保存实例值。这是一个例子:

@Override
public void onSaveInstanceState(Bundle outState) {
    // Retrieve the View
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    // Save its state
    outState.putString("My text",
    myTextView.getText().toString());
    super.onSaveInstanceState(outState);
}

如果在会话期间强制重新启动应用程序,则保存的 Bundle 将传递给 onRestoreInstanceStateonCreate 方法。然后,您可以从 Bundle 中提取值并使用它们来更新 Activity 实例状态。这是一个例子:

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    String text = “”;    
    if (icicle != null && icicle.containsKey("My text")) {
        text = icicle.getString(TEXTVIEW_STATE_KEY);
    }
    myTextView.setText(text);
}

记住onSaveInstanceState 仅在活动变为非活动状态时调用很重要,而不是在通过调用finish 或用户按下后退按钮关闭它时调用。

【讨论】:

  • 先前活动的整个状态如何。我的意思是活动在后台,有什么方法可以简单地将其带回前面。我的意思是,如果该活动中有许多线程正在运行,我相信最好的选择是将它放在前面。
【解决方案3】:

下载source code或查看the entire post

对于活动一,您需要使用 startActivityForResult() 函数将值返回给作为活动一的父活动。

    Intent intent = new Intent(MainActivity.this, Activity2.class);
   startActivityForResult(intent, 1);

要在不改变活动一的情况下接收活动二的值,请添加以下代码

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 1) {
                if(resultCode == RESULT_OK){
                    String text=data.getStringExtra("text");
                    vTxt.setText("Name 1: "+eTxt.getText()+ "\n Name 2: "+text);
                }
            }
        }

活动 2

添加以下代码以返回活动一并传递一些值

         Intent intent=new Intent(Activity2.this, MainActivity.class);

           Bundle extra=new Bundle();

           extra.putString("text", eTxt.getText().toString());
           intent.putExtras(extra);
           setResult(RESULT_OK, intent);
           finish();

你终于完成了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多