I start the Activity
(descendant of PreferenceActivity
) from my worker activity as follows:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1458)
loadInfo();
}
void showSettingsDialog()
{
startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}
MyConfigure
class does NOT have any setResult()
calls. In fact, MyConfigure
class doesn't have any code except OnCreate()
where it loads preferences using addPreferencesFromResource
.
Now onActivityResult
is called with requestCode
of 1458
prematurely, right after MyConfigure
activity is run. Tested on 1.6 and 2.1 emulators as well as 2.1 device. Is there a call to setResult()
buried somewhere in PreferenceActivity
? Or how else can this premature call be explained?
I solved my problem after removing
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
before callingfragment.startActivityForResult(intent, 0);
.I just removed all my custom "android:launchMode" from my Activity and everything worked like a charm. It is not a good idea change this when you don't know EXACTLY what Android is understanding... Android is a little tricky in this way.
Again as in Mayra's comment,
setResult()
has nothing to do with your problem. for some reason,MyConfigure
class finishes itself and when it happensPreferenceActivity
just assumes that there might be a result fromMyConfigure
because that's how you wrote the code.this also happens when you force back any activity thats started with
startActivityForResult()
...So, I think it's better to focus on why your
MyConfigure
class is forcibly finished.This is fixed by changing the launch mode to
singleTop
:There's a bug / feature (?) in Android, which immediately reports result (which has not been set yet) for
Activity
, declared assingleTask
(despite the fact that the activity continues to run). If we changelaunchMode
of the parent activity fromsingleTask
tosingleTop
, everything works as expected - result is reported only after the activity is finished. While this behavior has certain explanation (only onesingleTask
activity can exist and there can happen multiple waiters for it), this is still a not logical restriction for me.This happened to me when the intent had the
Intent.FLAG_RECEIVER_FOREGROUND
flag set.(Yes, that flag isn't activity-related, but I had it on all my intents as part of a shotgun solution to a different problem.)