How to pass and manipulate objects between activities using intents

别来无恙 提交于 2019-12-13 02:08:01

问题


This is my first issue with the Android lifecycleand I feel somewhat helpless:

In Activity A there's onCreate. That's the spot where I create an ArrayList called playerNames and ArrayList called moves. Also there's some more stuff happening in oncreate. In A's onStart I create a flag so I know which Activity is running in case I'd like to close all at once. In onDestroy the flag is set back to null.

Eventually I make an intent to get to Activity B where I take the moves list along. Works fine.

Now I'd like to make an intent from B to get back to A. What happens in the lifecycle when I attempt that? Obviously onCreate of A is called and leads to a NullPointerException regrding the playerNames list.

I'd like to store this ArrayList while B is running and get it back when I come back to A. Which method is the right one (onResume? onRestart?) and how do I store it? Do I really need SharedPreferences?

Thanks in advance for your kind help


回答1:


On Activity A:

-Create an Intent, specifying wich activity you want to start

-Put data on that intent to be received by activity B.

-Start Activity for a result.

-On onActivityResult() verify that you have data to receive and do what you want with it.

On Activity B:

-On the onCreate() receive the data from Activity A;

-Modify the data as you wish;

-Create a new Intent;

-Put the data in the Intent;

-Set the activity result and the intent data.

-Finish activity B

Below is a sample of the steps I describe, what it does is have activity A start an Activity B, and passing it an empty ArrayList. Then on Activity B, the arrayList is populated and sent back to Activity A where the contents of the arrayList, are displayed on screen.

Code:

Activity 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());
    }
}

Activty 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();
}

Attention: You cannot forget to declare your Activity B in the manifest File. Also pay attention on how the activities know what data to send and collect, through constants created in the classes, wich must be consistent, so avoid using literal strings, and use defined constants.




回答2:


From Activity B you can come back to the previous A instance using:

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

This will clear all current stack and go back to the A instance ( http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP ). As long as your Activity doesn't get destroyed, you'll have all data there.

Anyway, you should consider use Activity's save instance state capability ( http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29 ).



来源:https://stackoverflow.com/questions/21732520/how-to-pass-and-manipulate-objects-between-activities-using-intents

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!