我正在使用来自按钮处理程序的startActivityForResult()启动一个活动,并且我的onActivityResult()被称为立即,甚至在命中目标活动的onCreate()之前。
public void onGraphNext (View target) {
Intent i = new Intent(this, AddCommentActivity.class);
startActivityForResult(i,6); // 6 is arbitrary request code
}
。 。 。
protected void onActivityResult(int requestCode, int resultCode,
Intent returnData) {
if ( (resultCode == RESULT_OK) && (requestCode == 6) ) {
Bundle extras = returnData.getExtras();
comment = extras.getString("comment");
}
}
返回的结果代码是0,请求代码是6.在StackOverflow的其他地方,我看到有人报告这个问题,解决方案是不在清单中使用singeInstance作为launchMode。但我正在使用标准。 。 。
<activity android:name="AddCommentActivity"
android:configChanges="orientation"
android:screenOrientation="portrait"
android:launchMode="standard"></activity>
提前感谢任何见解!
编辑:我制作了一个简单的测试程序,当调用者(“启动器”) - onActivityResult的活动 - 是一个singleInstance并且调用了Activity时,我可以可靠地重现问题。 launchee“)是标准的。即,
<activity android:name="Launcher"
android:screenOrientation="portrait"
android:launchMode="singleInstance"></activity>
<activity android:name="Launchee"
android:screenOrientation="portrait"
android:launchMode="standard"></activity>
这对我来说是一个问题,因为在真正的应用程序中,由于其他原因,被调用者必须是singleInstance,但它希望有按钮来启动其他活动以请求用户输入。如果我不能使用startActivityForResult,怎么办呢?
答案 0 :(得分:11)
如果正在启动的活动未在与启动它的活动相同的任务中运行,则无法使用startActivityForResult()
。这意味着这两个活动都不能launchMode="singleInstance"
。如果您要求这两个活动在不同的任务中运行,那么您需要使用不同的机制。 documentation for startActivityForResult()
有点提示:
“例如,如果您要启动的活动使用singleTask 启动模式,它不会在您的任务中运行,因此您将 立即收到取消结果。“
您可以使用startActivity()
简单地启动活动,并让被叫活动调用startActivity()
返回您的活动,并根据需要发送数据作为Intent
中的附加内容它使用。
但是,您可能会考虑是否真的需要这些特殊的launchModes。一般来说,它们仅适用于HOME屏幕更换和其他非常特殊的应用。大多数使用singleInstance
或singleTask
启动模式的开发人员都使用错误。