1

我有两个活动:PictureList 和 AddPictures。从活动 PictureList 我请求这样的结果活动:

Intent myIntent = new Intent(PictureList.this, AddPictures.class);
Bundle b = new Bundle();
b.putInt("iEntry", clickCounter);
b.putBoolean("bAddPicture", true);
b.putBoolean("bEditPicture", false);
myIntent.putExtras(b);
startActivityForResult(myIntent,1);

我也在这里实现了相应的 onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == 1) {
         if(resultCode == RESULT_OK){        
             iReturnedEntry = data.getIntExtra("iReturnedEntry", 0);
         }
         if (resultCode == RESULT_CANCELED) {    
         }
      }
    }
}

在另一个活动中,AddPictures 接收参数:

Bundle b = getIntent().getExtras();
iEntry = b.getInt("iEntry");
bAddPicture = b.getBoolean("bAddPicture", false);
bEditPicture = b.getBoolean("bEditPicture", false);

当它必须返回时,它会这样做:

Intent returnIntent = new Intent();
returnIntent.putExtra("iReturnedEntry", iEntry);
setResult(RESULT_OK,returnIntent);     

通常应用程序工作正常,但经常发生结果未存储的情况。我认为由于某些内存管理或其他原因,PictureList 活动正在重新创建,或者它在从活动 AddPictures 返回后再次调用 onCreate 方法,因此 onActivityResult 不起作用。我该如何解决这个问题?

4

3 回答 3

1

如果您正在等待另一个活动的结果,最好的办法是将参数保存为共享首选项,然后在 onResume 期间将它们加载回上一个活动中。这样数据就不会因为重新创建包含onActivityResult的Activity而丢失。

然后,对于第一个活动 PictureList,代码变为:

bPictureRequested = true;
bPictureReceived = false;
appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
preferencesEditor = appSharedPreferences.edit();
preferencesEditor.putBoolean("bPictureReceived", bPictureReceived);
preferencesEditor.commit();

Intent myIntent = new Intent(PictureList.this, AddPictures.class);
Bundle b = new Bundle();
b.putInt("iEntry", clickCounter);
b.putBoolean("bAddPicture", true);
b.putBoolean("bEditPicture", false);
myIntent.putExtras(b);
startActivity(myIntent);

并进入 onResume 我添加了以下几行以获得结果:

if(bPictureRequested){
        appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        bPictureReceived = appSharedPreferences.getBoolean("bPictureReceived", false);
        if(bPictureReceived){
                iReturnedEntry = appSharedPreferences.getInt("iReturnedEntry", 0);
                // Reset the flags
                bPictureRequested = false;
                bPictureReceived = false;
                preferencesEditor = appSharedPreferences.edit();
                preferencesEditor.putBoolean("bPictureReceived", bPictureReceived);
                preferencesEditor.commit();
        }
}

现在,对于其他活动 AddPictures,我留下了按值获取先前参数的相同部分,但更改了它使用共享首选项返回数据的方式:

appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
preferencesEditor = appSharedPreferences.edit();
preferencesEditor.putBoolean("bPictureReceived", true);
preferencesEditor.putInt("iReturnedEntry", iEntry);
preferencesEditor.commit();
finish();

现在一切正常。

于 2013-05-30T21:58:45.407 回答
0

例如,当您的智能手机从纵向模式切换到横向模式时,您的活动被破坏并重新创建,需要备份数据,否则将被重置。

对于 AddPictures 类,尝试将数据保存在 Activity 的 onSaveInstanceState(Bundle outState) 方法中,然后在 onCreate() 方法中检索它们。如果您的活动被重新创建,这些方法会恢复您的数据。

例子:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("iReturnedEntry", iEntry);
    }

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            String dataSaved = savedInstanceState.getString("iReturnedEntry");
            Log.v("HelloWorldActivity", "iReturnedEntry=" + dataSaved);
        }

    }
于 2013-05-30T13:46:01.817 回答
0

是的,Android 可以重新创建活动,通常是因为它在活动暂停时需要内存。

在此处阅读 Activity 生命周期,并使用 onPause() 和 onResume() 方法在 Activity 暂停和恢复时保存和恢复 PictureList Activity 的状态。

FWIW 对 Fragments 也是如此,只是它们更频繁地被创建和销毁(例如,当您在横向和纵向之间旋转设备时)。理解 Activity 和 Fragment 生命周期并正确使用它,对于编写性能良好的应用程序至关重要。

于 2013-05-30T13:42:20.547 回答