如何使用意图在活动之间传递和操作对象

时间:2014-02-12 15:41:03

标签: java android arraylist activity-lifecycle

这是Android生命周期的第一个问题,我感到有点无奈:

在活动 A 中有onCreate。这就是我创建名为 playerNames 的ArrayList和名为的ArrayList移动​​的地方。还有一些在oncreate中发生的事情。在A的onStart中,我创建了一个标志,因此我知道哪个Activity正在运行,以防我想立即关闭。在onDestroy中,标志被设置回null。

最终我打算转到Activity B ,我将移动列表放在其中。工作正常。

现在我想从B做出一个意图回到A.当我尝试时,生命周期会发生什么?显然onCreate of A被调用并导致重新生成 playerNames 列表的NullPointerException。

我想在B运行时存储这个ArrayList,当我回到A时将其取回。哪个方法是正确的(onResume?onRestart?),我该如何存储它?我真的需要SharedPreferences吗?

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

从活动B,您可以使用以下命令返回上一个A实例:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

这将清除所有当前堆栈并返回A实例(http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP)。只要您的活动没有被销毁,您就可以获得所有数据。

无论如何,您应该考虑使用Activity的保存实例状态功能(http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29)。

答案 1 :(得分:0)

关于活动A:

创建一个意图,指定你想要开始的活动

- 列出活动B收到的意图数据。

- 结果的开始活动。

-On onActivityResult()验证您是否有要接收的数据,并使用它执行您想要的操作。

活动B:

- onCreate()从活动A接收数据;

- 根据需要修改数据;

- 创建一个新的意图;

- 在Intent中输入数据;

- 设置活动结果和意图数据。

- 完成活动B

下面是我描述的步骤示例,它的作用是具有活动A启动活动B,并向其传递一个空的ArrayList。然后在Activity B上,填充arrayList并将其发送回Activity A,其中arrayList的内容显示在屏幕上。

代码:

活动A:

private static final int REQUEST_LIST = 1;
ArrayList<String> myList;
TextView listText;

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

    listText = (TextView) findViewById(R.id.mylist_text);
    myList = new ArrayList<String>();

    Intent i = new Intent(MainActivity.this, ActivityB.class);
    i.putExtra(ActivityB.EXTRA_ARRAY, myList);
    startActivityForResult(i, REQUEST_LIST);

}

@Override
protected void
        onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode != Activity.RESULT_OK) return;

    if (requestCode == REQUEST_LIST) {
        myList = (ArrayList<String>) data.getSerializableExtra(ActivityB.EXTRA_ARRAY);

        StringBuilder text = new StringBuilder();
        for (int j = 0; j < myList.size(); j++) {
            text.append(myList.get(j) + " ");
        }

        listText.setText(text.toString());
    }
}

活动B:

public static final String EXTRA_ARRAY = "com.example.androidtest.mainactivity.array";

ArrayList<String> myList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activityb_layout);
    myList = (ArrayList<String>) getIntent().getSerializableExtra(EXTRA_ARRAY);

    for (int i = 0; i < 10; i++) {
        myList.add(String.valueOf(i));
    }

    Intent data = new Intent();
    data.putExtra(EXTRA_ARRAY, myList);
    setResult(Activity.RESULT_OK, data);

    finish();
}

注意:您不能忘记在清单文件中声明您的活动B.还要注意活动如何知道要发送和收集的数据,通过在类中创建的常量,必须保持一致,因此避免使用文字字符串,并使用定义的常量。