Reputation: 16907
I have an app that opens a config activity at initial start up, and that config activity opens a list activity (startActivityForResult in onCreate). In the list activity the user can choice a value, which closes the list and sends the value to the config activity (setResult, finish, onActivityResult).
That works fine when I try it in the emulator and for almost everyone who has tried it.
However, now someone has send a mail that it does not work on his device (Galaxy): he can select something in the list and close it, but the config activity opens it again (as if it has not received the selected result). What could be going on? What do I need to ask the user to figure it out?
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
Upvotes: 0
Views: 509
Reputation: 836
It looks like on some devices due to low memory or other reason AccountInfo might be calling onCreate when the LibraryList was finishedm, You are recalling open list at only two places after getting result from onActivityResult and other is from OnCreate, As you are sure that onActivityResult will always get result
Here are some checks you can try on
startActivityForResult()
correctly, do not use startActivity()
.onBackPressed
method, super.onBackPressed();
has to be positioned at the last of the method, not at the first line. (my case to spend 5 hours)android:launchMode="singleInstance"
in manifest or equivalent argument to create a intent.noHistory="true"
in manifest of the callee activity.setResult()
is missed.finish()
is called to close the activity. use finishActivity()
to close callee activity.requestCode
more than zero. negative value does not work. Upvotes: 1