Android保留活动状态

时间:2014-07-22 12:10:01

标签: android listview

我正在尝试将自定义对象从一个活动传递到另一个活动。这样做的方式是我的ListViewMainActivity在应用首次启动时为空。有一个指向我RecordActivity的按钮。在用户填写数据后,他们按下“完成”按钮,将对象传回我的MainActivity并将其放入List。这工作正常,但是当我想添加第二个对象时,它只是替换第一个对象,而不是仅将其添加到列表中。我假设这是因为我每次拨打MainActivity时都会重新创建startActivity(intent)。我需要保存MainActivity的状态,搜索后我找不到解决问题的线程。

以下是我RecordActivity传递对象的代码:

Intent intent = new Intent(getBaseContext(), MainActivity.class);
intent.putExtra("newRecord", EXTRA_RECORD);
startActivity(intent);

以下是我的MainActivity

中检索此代码的代码
Bundle extras = getIntent().getExtras();
if(extras != null){
    Record addedRecord = extras.getParcelable("newRecord");
    adapter.add(addedRecord);
}

使用onNewIntent方法:

@Override
public void onNewIntent(Intent intent){
    Bundle extras = getIntent().getExtras();
    if(extras != null){
        Record addedRecord = extras.getParcelable("newRecord");
        recordArrayList.add(addedRecord);
        adapter.add(addedRecord);
    }

}

adapter是填充ArrayAdapter

ListView

修改

我应该注意,我希望这个列表是持久的,以便每次应用程序打开时,列表都是从上次开始的。我不知道这是否会影响我的问题,因为我需要使用SharedPreference来存储我的列表

解决方案

onNewintent方法中:

Bundle extras = getIntent().getExtras();

应该是:

Bundle extras = intent.getExtras();

2 个答案:

答案 0 :(得分:1)

在开始MainActivity;

时添加以下行
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

调用此方法后,onCreate处的MainActiviy方法也不会被调用。您必须使用onNewIntent方法处理额外内容。

修改:

  

每次应用打开时,列表都是从上次开始的

为了达到此目的,您必须在SharedPrefs或SQLLite DB中存储ListView的项目。

答案 1 :(得分:0)

您可以致电MainActivity返回主要活动,而不是在RecordActivity中启动finish()。 启动RecordActivity时启动它:

Intent i = new Intent(this, RecordActivity.class);
startActivityForResult(i, EXTRA_RECORD_RESULT);

但在调用finish()之前,您需要将数据发回去,您可以通过以下方式实现此目的:

Intent resultIntent = new Intent();
resultIntent.putExtra("key", "value");
setResult(Activity.RESULT_OK, resultIntent);
finish();

在您的主要活动中,此方法被调用:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == EXTRA_RECORD_RESULT)
    {
        value = data.getStringExtra("key");         
    }
}