Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag

最近在做一个人脸识别相关的项目,调用context.startActivity(intent)方法,报错如下:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?


分析:Activity继承自Context,查看Context.startActivity(Intent, Bundle),下图是该方法注释的一部分:

说明:

如果这个方法被一个不是Activity的Context调用,那么这个Intent必须包括Intent.FLAG_ACTIVITY_NEW_TASK这个flag,如果是被Activity的Context调用,则不需要。

这是因为,如果不是被一个已存在的Activity启动,就没有已存在的栈去替换新的Activity,所以需要让它在自身的栈中。所以需要这个Intent设置启动参数Intent.FLAG_ACTIVITY_NEW_TASK这个flag,让新Activity在它自身的栈中。

由于我是在React-native当中通过自定义模块,让react-native调用android原生接口(Android native和React-native相互调用和传参_晒干的老咸鱼的博客-CSDN博客),该自定义的module初始化如下:

 定义Context的时候使用

private ReactApplicationContext mContext;

在使用的时候,先判断ReactApplicationContext有没有currentActivity,如果有,就拿到Activity对象,然后通过该对象来启动新的Activity。

if (mContext.hasCurrentActivity()){
               Activity currentActivity = mContext.getCurrentActivity();
               Log.d(TAG, "currentActivity: " + currentActivity);
               WbCloudFaceVerifySdk.getInstance().startWbFaceVerifySdk(currentActivity, new WbCloudFaceVerifyResultListener() {
                  @Override
                  public void onFinish(WbFaceVerifyResult result) {
                     if (result != null) {
                        if (result.isSuccess()) {
                           Log.d(TAG, "刷脸成功!");
                        } else {
                           Log.d(TAG, "刷脸失败!");
                        }
                     }
                     //刷脸结束后,及时释放资源
                     WbCloudFaceVerifySdk.getInstance().release();
                  }
               });
            }
//            callback.invoke(STATUS_SUCCESS);
         }

这里为什么不在一开始初始化的时候定义mContext为Activity的Context,可以参考如下说明(ReactContextBaseJavaModule getCurrentActivity 返回空问题_晒干的老咸鱼的博客-CSDN博客)

猜你喜欢

转载自blog.csdn.net/chali1314/article/details/125910599