startActivity和startActivityForResult以及ActivityManager框架
来源:互联网 发布:美橙互联 阿里云 编辑:程序博客网 时间:2024/04/29 16:22
最近研究启动模式,顺便查看了一下startActivity和startActivityForResult的源码:
最后发现startActivity最后也是调用
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) ;这个方法的。
我们来看看这个方法(sdk23):
* 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. *public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { if (mParent == null) { Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) { mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } if (requestCode >= 0) { // If this start is requesting a result, we can avoid making // the activity visible until the result is received. Setting // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the // activity hidden during this time, to avoid flickering. // This can only be done when a result is requested because // that guarantees we will get information back when the // activity is finished, no matter what happens to it. mStartedActivity = true; } cancelInputsAndStartExitTransition(options); // TODO Consider clearing/flushing other event sources and events for child windows. } else { if (options != null) { mParent.startActivityFromChild(this, intent, requestCode, options); } else { // Note we want to go through this method for compatibility with // existing applications that may have overridden it. mParent.startActivityFromChild(this, intent, requestCode); } }}分析:从它的注释中我们可以知道两点:
1)这个方法的请求码参数分为>=0和<0两种情况,startActivity方法中调用这个方法时使用的就是-1,如果直接调用这个方法并且
请求码传值为负数就相当于是调用startActivity,不会有onActivityResult方法的回调。前者启动的activity是当前activity的
子activity,后者启动的activity则不是。
2)使用这个方法时传的Intent的协议需要是属于等待返回一个结果的,如果是其他不需要返回结果的,
比如:@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may not get the result when you expect。
当然,这里有个例子:比如使用这个方法准备启动的activity的启动模式是singleTask,你将会直接接受到一个表示取消的返回结果。
最后推荐一篇非常不错的博客,这篇博客刚刚好解决了我研究activity启动代码时遇到的瓶颈!点击打开链接
1 0
- startActivity和startActivityForResult以及ActivityManager框架
- startActivityForResult startActivity 和 setResult
- StartActivity 和 StartActivityForResult
- startActivity和startActivityForResult
- startActivityForResult和startActivity详解
- startActivity()和startActivityForResult()
- startActivity()和startActivityForResult()区别
- startActivityForResult 和startActivity的区别
- Android之startActivity()和startActivityForResult()
- startActivity和startActivityForResult用法详解
- startActivity(),startActivityForResult(),
- startActivity startActivityForResult
- startActivityForResult,startActivity,setResult用法和详解
- ActivityManager和PackageManager框架简介
- startActivityForResult与startActivity
- startActivityForResult与startActivity
- startActivityForResult与startActivity
- 【Android】startActivityForResult与startActivity
- 理解 Java 的三大特性之继承
- 理解 Java 的三大特性之多态
- Spring MVC 全局异常处理(3) ---@ExceptionHandler注解
- 安装sql2012出现错误could not open key...解决办法
- 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题
- startActivity和startActivityForResult以及ActivityManager框架
- 【3-1-28】void类型指针和空指针详解
- Ubuntu 14.04 安装与配置 Git
- git--基础【1】
- 【android】Android Studio修改代码提示快捷键
- Mongodb3.4分片搭建
- 对json按某个键的值进行排序
- 通用IO(一)
- 普通的form提交、ajax提交和jQuery的ajax的form提交