startActivityForResult得不到onActivityResult返回值

2015年12月17日 Android 1条评论 阅读1636次

startActivityForResult得不到onActivityResult返回值

警惕android:launchMode="singleInstance"导致startActivityForResult得不到onActivityResult返回值。

原始标题想用这个的,但因太长了,就简略了一下。

问题的现象很简单。 ActivityA中一个按钮,点击触发的事件:

startActivityForResult(new Intent(this, ActivityB.class));

在ActivityB中,设置返回的结果:

setResult(RESULT_OK, intent);
ActivityB.this.finish();

回到ActivityA:回调方法

onActivityResult(int requestCode, int resultCode, Intent data)

期待是resultCode为RESULT_OK,并从data中得到想要的数据。

但遗憾的是resultCode并不是RESULT_OK,而是RESULT_CANCELED。

好了,发生的问题现象基本就是这样子。 原因在开头已经透漏了。就是activity的launchMode被设置为单例模式了。 解决方法: 只要把AndroidManifest.xml中的android:launchMode="singleInstance"删除即可。

android.app.Activity类中的如下方法 public void startActivityForResult(Intent intent, int requestCode, Bundle options) 有下面的注释说明

Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as Intent.ACTION_MAIN or 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.


重新温习Activity的启动模式

以下转载自Hibraincol的cnblogs,多谢---------

  • standard
  • singleTop
  • singleTask
  • singleInstance

这4中模式又分两类,standard和signleTop属于一类, singleTask和signleInstance属于另一类。

  • standard和singleTop属性的 Activity 的实例可以属于任何任务(Task),并且可以位于Activity堆栈的任何位置。比较典型的一种情况是,一个任务的代码执行startActivity(),如果传递的 Intent 对象没有包含 FLAG_ACTIVITY_NEW_TASK 属性, 指定的 Activity 将被该任务调用,从而装入该任务的Activity 堆栈中。
  • standard和singleTop的区别在于:standard模式的Activity在被调用时会创建一个新的实例,所有实例处理同一个Intent对象; 但对于singleTop模式的Activity,如果被调用的任务已经有一个这样的Activity 在堆栈的顶端,那么不会有新的实例创建, 任务会使用当前顶端的Activity实例来处理Intent对象,换句话说,如果被调用的任务包含一个不在堆栈顶端的 singleTop Activity, 或者堆栈顶端为 singleTop 的Activity的任务不是当前被调用的任务,那么,仍然会有一个新的Activity对象被创建。

singleTask 和 singleInstance模式的Activity 仅可用于启动任务的情况,这种模式的Activity总是处在Activity堆栈的最底端,并且一个任务中只能被实例化一次。

两者的区别在于:对于 singleInstance模式的Activity, 任务的Activity堆栈中如果有这样的Activity,那它将是堆栈中的唯一的 Activity, 当前任务收到的 Intent 都由它处理, 由它开启的其他 Activity 将在其他任务中被启动; 对于 SingleTask模式的Activity,它在堆栈底端,其上方可以有其他Activity被创建, 但是,如果发给该Activity的Intent对象到来时该Activity不在堆栈顶端,那么该Intent对象将被丢弃,但是界面还是会切换到当前的Activity。

--------以上为转载内容,转载结束的分割线---------------


另外,还要注意调用startActivityForResult时的requestCode应该要传递一个非负整数。不多解释,直接附上源码。

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;
}

startactivityforresult-cannot-get-reponsedata-launchMode

分享本文至:

WRITTEN BY

avatar
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

1 条评论

  1. avatar <a>aa</a>

    oracle数据库查看用户锁表及对表解锁的sql语句

欢迎留言




用户登录

sitemap