我有一个应用程序在初始启动时打开配置活动,该配置活动打开一个列表活动(onCreate中的startActivityForResult)。在列表活动中,用户可以选择一个值,该值关闭列表并将值发送到配置活动(setResult,finish,onActivityResult)。
当我在模拟器中尝试并且几乎所有尝试过它的人都可以正常工作。
但是,现在有人发送了一封邮件,说明它无法在他的设备上运行(Galaxy):他可以在列表中选择并关闭它,但配置活动会再次打开它(就好像它没有收到所选的一样)结果)。会发生什么事?我需要用什么来让用户弄明白?
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是两个活动的singleTop
答案 0 :(得分:1)
在某些设备上,由于内存不足或其他原因,当LibraryList完成时,AccountInfo可能会调用onCreate,在从onActivityResult获取结果后,您只在两个位置调用打开列表,而其他是来自OnCreate,因为你是确保onActivityResult始终获得结果
以下是您可以尝试的一些检查
startActivityForResult()
,请勿使用startActivity()
。onBackPressed
方法中执行某项操作,则super.onBackPressed();
必须位于方法的最后一个位置,而不是第一行。 (我的情况是花5个小时)android:launchMode="singleInstance"
以创建意图。noHistory="true"
。setResult()
。finish()
来关闭活动。使用finishActivity()
关闭被叫活动。requestCode
大于零。负值不起作用。