【问题标题】:Android: onActivityResult() local data is missingAndroid:onActivityResult() 本地数据丢失
【发布时间】:2014-12-09 20:29:15
【问题描述】:

我有两个活动(活动 1 和活动 2)。 Activity1 启动 Activity2 以获取一些数据。每当我回到 Activity1 时,onCreate 方法在 onActivityResult() 之前运行。所有数据都消失了。为什么 onCreate 方法第二次运行,数据丢失?

您可以查看下面的示例代码以查看示例场景。在这种情况下,onActivityResult 方法中 var1 的值应该是 5,但它是 0。

public class MainActivity1 extends ActionBarActivity 
{
    TextView textView1;
    Button button1;
    int var1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity1);

        textView1 = (TextView) findViewById(R.id.textView1);
        button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                var1 = 5;
                Intent intent = new Intent(MainActivity1.this, MainActivity2.class);
                startActivityForResult(intent, 2);// Activity is started with requestCode 2
            }
        });
    }

    // Call Back method  to get the Message form other Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 2) {
            String message = data.getStringExtra("MESSAGE");
            textView1.setText("value =" + var1);

        }
    }

}


public class MainActivity2 extends ActionBarActivity {

    EditText editText1;
    Button button1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);

        editText1=(EditText)findViewById(R.id.editText1);
        button1=(Button)findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String message=editText1.getText().toString();
                Intent intent=new Intent();
                intent.putExtra("MESSAGE",message);

                setResult(2,intent);

                finish();//finishing activity
            }
        });
    }

}

【问题讨论】:

    标签: java android android-activity start-activity


    【解决方案1】:

    你做错了。您正在意图中保存一个字符串。 然后在onActivityResult方法中你从intent中获取String,然后设置TextView的文本为"value =" var1,但是你没有从Intent中加载var1

    您应该将值var1 保存在MainActivity2 的intent 中,然后在onActivityResult 方法中从intent 中检索它。

    【讨论】:

    • 是的,他应该这样做。但请给出更好的指示。保存?使用 putExtra! Intent intent=new Intent(); ?最好使用 getIntent() 否则 var 将不存在。
    • 感谢您的回复!你的意思是我不应该把数据留在我身后,当我去参加活动时,我应该带着它们,当我回来时,我应该把它们带回来。我做对了吗?即使有很多数据,这仍然是最佳做法吗? @Pierfrancesco Soffritti
    • 不,逻辑步骤是: 1. 为结果启动一个活动 2. 在这个活动中做一些操作 3. 将这些操作的结果保存在意图中(使用 putExtra() ) 4. 完成活动 5. 在第一个活动的 onActivityResult 方法中获取您保存在意图中的结果
    【解决方案2】:

    在“设置”>“开发者选项”中有一个名为“不保留活动”的设置。确保未启用此功能,否则一旦您启动第二个 Activity,该 Activity 就会被销毁,并且您将在返回第一个 Activity 时重新创建它。

    【讨论】:

    • @user3269905 在后台时,第一个 Activity 可能会被 Android OS 销毁,在这种情况下,您将再次遇到此问题。你应该更好地实现你的方法的逻辑。
    • Soffritti 做对了...做一个简单的检查:开始第二个活动,更改手机的方向,回到第一个活动...这是 hack 不是解决方案
    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多