最近在做一個(gè)人臉識(shí)別相關(guān)的項(xiàng)目,調(diào)用context.startActivity(intent)方法,報(bào)錯(cuò)如下:
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),下圖是該方法注釋的一部分:
說(shuō)明:
如果這個(gè)方法被一個(gè)不是Activity的Context調(diào)用,那么這個(gè)Intent必須包括Intent.FLAG_ACTIVITY_NEW_TASK這個(gè)flag,如果是被Activity的Context調(diào)用,則不需要。
這是因?yàn)?,如果不是被一個(gè)已存在的Activity啟動(dòng),就沒(méi)有已存在的棧去替換新的Activity,所以需要讓它在自身的棧中。所以需要這個(gè)Intent設(shè)置啟動(dòng)參數(shù)Intent.FLAG_ACTIVITY_NEW_TASK這個(gè)flag,讓新Activity在它自身的棧中。
由于我是在React-native當(dāng)中通過(guò)自定義模塊,讓react-native調(diào)用android原生接口(Android native和React-native相互調(diào)用和傳參_曬干的老咸魚(yú)的博客-CSDN博客),該自定義的module初始化如下:
?定義Context的時(shí)候使用
private ReactApplicationContext mContext;
在使用的時(shí)候,先判斷ReactApplicationContext有沒(méi)有currentActivity,如果有,就拿到Activity對(duì)象,然后通過(guò)該對(duì)象來(lái)啟動(dòng)新的Activity。文章來(lái)源:http://www.zghlxwxcb.cn/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, "刷臉失??!");
}
}
//刷臉結(jié)束后,及時(shí)釋放資源
WbCloudFaceVerifySdk.getInstance().release();
}
});
}
// callback.invoke(STATUS_SUCCESS);
}
這里為什么不在一開(kāi)始初始化的時(shí)候定義mContext為Activity的Context,可以參考如下說(shuō)明(ReactContextBaseJavaModule getCurrentActivity 返回空問(wèn)題_曬干的老咸魚(yú)的博客-CSDN博客)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-617260.html
到了這里,關(guān)于Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!