Android startActivityForResult与singleTask使用问题
2016-07-22 18:36
543 查看
我们都知道在activity中有一个方法startActivityForResult,(假设有两个activity A,B)该方法的作用就是在activity A启动一个activity B后,如果该activity B调用finish方法,会触发activity B的onActivityForResult方法,在该方法中我们可以获取activity B需要返回给Activity A的数据,然而当启动的activity A的启动模式为singleTash或者singleInstance时,在调用startActivityForResult方法时会立即回调onActivityForResult方法,并且其中的resultCode为cancel值,这是什么原因呢?我们查看系统源码:
上面注释已经写的很清楚了,当启动的activity B是singleTask时, activity A和activity B两个activity不在同一个任务栈中(这个地方有歧义,实际上以singleTask启动模式启动一个activity并不一定会重新开启一个任务栈,只有当系统中不存在与该activity的TaskAffinity相同的任务栈时,系统才会创建一个新的任务栈),所以activity A将会立即得到一个cancel的结果。
所以为了满足任务栈中只存在一个activity B,同时又能够正常使用activity的startActivityForResult,我们可以将activity的启动模式设置为standard同时将intent添加一个flag:Intent.FLAG_CTIVITY_CLEAR_TOP.
/** * 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. 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. * * <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. * * @throws android.content.ActivityNotFoundException * * @see #startActivity */ public void startActivityForResult(Intent intent, int requestCode)
上面注释已经写的很清楚了,当启动的activity B是singleTask时, activity A和activity B两个activity不在同一个任务栈中(这个地方有歧义,实际上以singleTask启动模式启动一个activity并不一定会重新开启一个任务栈,只有当系统中不存在与该activity的TaskAffinity相同的任务栈时,系统才会创建一个新的任务栈),所以activity A将会立即得到一个cancel的结果。
所以为了满足任务栈中只存在一个activity B,同时又能够正常使用activity的startActivityForResult,我们可以将activity的启动模式设置为standard同时将intent添加一个flag:Intent.FLAG_CTIVITY_CLEAR_TOP.
相关文章推荐
- startActivityForResult与onActivityResult
- Android使用 startActivityForResult 、 onActivityResult 时的注意事项
- startActivityForResult与onActivityResult
- Activity之间数据交流(onActivityResult的用法)
- Fragment startActivityForResult与getActivity().startActivityForResult
- 使用intent相互传递数据
- Activity跳转——返回数据到前Activity
- startActivityForResult的用法
- startActivityForResult()、onActivityResult()和setResult()使用
- startActivityForResult使用步骤分解
- android 启动activity
- startActivityForResult用法详解
- 在Fragment中调用startActivityForResult()后requestCode发生改变
- startActivityForResult方法的使用
- startActivityForResult的简单使用
- Android进阶03——调用另一个Activity并返回结果
- android中Activity的启动模式是singleTask或singleInstance与startActivityForResult,onActivityResult
- Android之Activity启动和结束方法-无传递结果数据
- Android之Activity启动和结束方法-传递结果数据
- Android—startActivityForResult的用法