淘先锋技术网

首页 1 2 3 4 5 6 7

最近在做一个二维码扫描的模块,在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,其他的方式是否可行未做测试。