最近在做一个人脸识别相关的项目,调用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。文章来源:https://www.toymoban.com/news/detail-617260.html
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博客)文章来源地址https://www.toymoban.com/news/detail-617260.html
到了这里,关于Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!