startActivityForResult小坑

高平後生發表於2016-11-06

在開啟一個Activity並希望返回特定資料的時候,會用到startActivityForResult方法:

<span style="font-family: Arial, Helvetica, sans-serif;">public void startActivityForResult(Intent intent, int requestCode) {</span>
        startActivityForResult(intent, requestCode, null);
    }

然後在onActivityResult()方法中進行一系列的判斷,如果requestCode是我們指定的code就下一步,如果resultCode是RESULT_OK就下一步,但是要注意一個細節:

就是startActivityForResult方法中,跟進看一下注釋:


/**
     * Launch an activity for which you would like a result when it finished.
     * When this activity exits, your
     * onActivityResult() method will be called with the given requestCode.
     * Using a negative requestCode is the same as calling
     * {@link #startActivity} (the activity is not launched as a sub-activity).
     *
     * <p>Note that this method should only be used with Intent protocols
     * that are defined to return a result.  In other protocols (such as
     * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
     * not get the result when you expect.  <span style="color:#ff0000;">For example, if the activity you
     * are launching uses the singleTask launch mode, it will not run in your
     * task and thus you will immediately receive a cancel result.</span>
     *
     * <p>As a special case, if you call startActivityForResult() with a requestCode
     * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
     * activity, then your window will not be displayed until a result is
     * returned back from the started activity.  This is to avoid visible
     * flickering when redirecting to another activity.
     *
     * <p>This method throws {@link android.content.ActivityNotFoundException}
     * if there was no Activity found to run the given Intent.
     *
     * @param intent The intent to start.
     * @param requestCode If >= 0, this code will be returned in
     *                    onActivityResult() when the activity exits.
     * @param options Additional options for how the Activity should be started.
     * See {@link android.content.Context#startActivity(Intent, Bundle)
     * Context.startActivity(Intent, Bundle)} for more details.
     *
     * @throws android.content.ActivityNotFoundException
     *
     * @see #startActivity
     */
注意紅色字型標出的,如果你是singleTask的啟動模式,那麼你就會在startActivityForResult方法呼叫之後立即接受到一個RESULT_CANCEL的結果,你自己定義的資料並不會接收到,在這裡要注意一下。

相關文章