1. 程式人生 > >Fragment onActivityResult提前響應,startActivityForResult執行後立即響應onActivityResult的解決方法

Fragment onActivityResult提前響應,startActivityForResult執行後立即響應onActivityResult的解決方法

找不到病根真是讓人愁白了頭;

今天寫了一個startActivityForResult,開啟一個Activity並拿到返回的結果,但是startActivityForResult剛走,onActivityResult就立即響應了,這我要這個onActivityResult有何用;

來看開啟程式碼:

                        Intent intaentPermission = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                        intaentPermission.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intaentPermission.setData(Uri.parse( "package:"+getPackageName()));
                        startActivityForResult(intaentPermission,windowHintStartPermission);

這個是回撥程式碼:

   @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == windowHintStartPermission){
            if (Build.VERSION.SDK_INT >= 23) {
                if (!Settings.canDrawOverlays(getActivity())) {
                    UIHelper.showToast("您未開啟懸浮窗許可權,遙控正在後臺執行");
                }else {
                    Intent intent = new Intent(getActivity(), TelecontrolQueryService.class);
                    intent.putExtra("id", "");
                    getActivity().startService(intent);
                }

            }else {
                Intent intent = new Intent(getActivity(), TelecontrolQueryService.class);
                intent.putExtra("id","");
                getActivity().startService(intent);
            }
        }
    }

我真是日了狗了,開啟程式碼剛執行結束,回撥程式碼就走了;

來、劃重點了:

經排查,發現這個提前回調跟Activity的啟動模式有關(launchMode),舉個栗子:Activity1使用startActivityForResult開啟Activity2,Activity2的launchMode如果不是標準模式,就會出現提前回調的問題,onActivityResult立即執行;

我的解決方法:

                        Intent intaentPermission = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
//                        intaentPermission.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //把啟動模式註釋掉
                        intaentPermission.setData(Uri.parse( "package:"+getPackageName()));
                        startActivityForResult(intaentPermission,windowHintStartPermission);

還有就是,不要getActivity().startActivityForResult();在Fragment中開啟Activity前面不要加getActivity(). ;不然你的onActivityResult方法會不執行;