我有一个应用程序,在初始启动时打开配置活动,该配置活动打开一个列表活动(startActivityForResult in onCreate)。在列表活动中,用户可以选择一个值,该值关闭列表并将该值发送给配置活动(setResult、finish、onActivityResult)。
当我在模拟器中尝试它时,它工作得很好,几乎所有尝试过它的人。
然而,现在有人发送了一封邮件,它不工作在他的设备(银河):他可以选择列表中的东西并关闭它,但配置活动再次打开它(好像它没有收到选择的结果)。会发生什么呢?我需要问用户什么才能弄明白?
public class AccountInfo extends VideLibriBaseActivity /* extends SherlockActivity */ {
void openList(){ //called in onCreate and on cancel
findViewById(R.id.libraryTextView).postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(AccountInfo.this, LibraryList.class);
//...
startActivityForResult(intent, REQUEST_LIBRARY_FOR_ACCOUNT_CREATION);
}
}, 200); //did not work without delay on some devices
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_LIBRARY_FOR_ACCOUNT_CREATION) {
if (resultCode == LibraryList.RESULT_OK) {
libId = data.getStringExtra("libId");
libName = data.getStringExtra("libName");
lib.setText(libName);
//...
} else if (libId.equals(""))
if (mode == MODE_ACCOUNT_CREATION_INITIAL && (VideLibriApp.accounts.length == 0))
openList();
else
finish();
}
}
}
public class LibraryList extends VideLibriBaseActivity /* extends SherlockActivity */ {
//...
lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i2, long l) {
Intent result = new Intent();
result.putExtra("libName", localLibs.get(i).get(i2).get("NAME"));
result.putExtra("libId", localLibs.get(i).get(i2).get("ID"));
//...
setResult(RESULT_OK, result);
LibraryList.this.finish();
return true;
}
});
//...
}
launchMode is singleTop for both activities
它看起来像在一些设备上由于低内存或其他原因AccountInfo可能会调用onCreate当LibraryList完成时,你从onActivityResult和其他onCreate中获得结果后,只在两个地方召回打开列表,因为你确信onActivityResult将始终获得结果
这里有一些你可以试穿的检查
- 检查
startActivityForResult()
是否正确使用,不要使用startActivity()
。 - 如果您在覆盖
onBackPressed
方法中做一些事情,super.onBackPressed();
必须定位在方法的最后,而不是在第一行。(我的案例花了5个小时) 删除manifest中的 - 删除被调用者活动清单中的
noHistory="true"
- 检查
setResult()
缺失 调用 -
finish()
来关闭活动。使用finishActivity()
关闭被调用者活动。 - 使用
requestCode
大于零。负值不行。
android:launchMode="singleInstance"
或等效参数以创建意图。