最近在做一个二维码扫描的模块,在Fragment中startActivityForResult开启需要返回结果的二维码扫描的Activity,扫描完成后,Fragment的onActivityResult没有任何反应。
下面贴出来的是多次测试后的正确代码:
setResult返回结果的Activity:
public class CaptureActivity {
...
public static final int SCAN_RESULT = ;
...
setResult(SCAN_RESULT, resultIntent);
...
}
Fragment代码:
public class TestSubFragment extends HYSubFragment {
...
public static final int SCANNIN_GREQUEST_CODE = ;
...
/**
* 启动二维码扫描活动
*/
public void startQRCodeScanActivity() {
Intent intent = new Intent(getActivity(),CaptureActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SCANNIN_GREQUEST_CODE
&& resultCode == CaptureActivity.SCAN_RESULT) {
Bundle bundle = data.getExtras();
new MaterialDialog.Builder(getActivity())
.title("爱动号")
.content("扫描到的号码:" + bundle.getString("result"))
.negativeText("知道了")
.show();
textView.setText(bundle.getString("result"));
}
}
}
TestSubFragment 所依附的fragmentActivity的代码:
public class HYSubActivity extends AppCompatActivity {
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this, "HYSubActivity requestCode:" + requestCode , Toast.LENGTH_LONG).show();
}
...
}
Manifest配置:
...
<activity
android:name=".HYSubActivity"
// android:launchMode="singleInstance"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="cn.toltech.treefrog.qrcodescanner.CaptureActivity"
android:clearTaskOnLaunch="true"
android:label="@string/app_name"
android:screenOrientation="landscape"
// android:launchMode="singleInstance"
android:stateNotNeeded="true" >
<intent-filter>
<action android:name="com.google.zxing.client.android.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
...
个人测试后的一些总结:
1、Fragment中直接使用startActivityForResult(); 不要使用this.getActivity().startActivityForResult();
2、Fragment依附的Activity中如果重写了onActivityResult()方法,该方法中必须加上super.onActivityResult(requestCode, resultCode, data);( 要么在Activity中不重写onActivityResult()方法,亲测可用)。Fragment中的onActivityResult()方法中加不加super.onActivityResult(requestCode, resultCode, data)这句代码对结果没有影响。
3、startActivityForResult()方法刚一调用,还没等activity返回,onActivityResult()方法已经执行完了。(亲测:执行顺序是:Fragment中的onActivityResult()先执行,Activity中的onActivityResult()后执行)出现上面问题的原因可能是:
① manifest中CaptureActivity 或者 HYSubActivity 的activity设置了launchMode属性,其值不是标准模式(standard)。
解决办法就是把launchMode属性去掉或者设置为标准模式。
② Fragment在startActivityForResult的时候,使用了Intent.FLAG_ACTIVITY_NEW_TASK,跳转到新的任务栈导致onActivityResult()被执行。
解决办法就是不要使用Intent.FLAG_ACTIVITY_NEW_TASK开启Activity,其他的方式是否可行未做测试。