概述:
最近在开发一个Flutter插件项目的时候,遇到这个问题:
Calling startActivity() from outside of an Activity? context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
android原生集成一个三方的sdk,通过flutter插件调用sdk的方法。其中有一个Intent跳转页面的时候,出现了这个问题。
解决思路:
1.首先,按照字面的意思,就是需要在intent跳转的时候,开启一个新的task;
2.通过度娘知道,引起这个问题的根本原因是:Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的話,就需要开启一个新的的task;
3.从而,就能得出解决方法:
/**
* 启动新的Activity
* @param context 当前Activity
* @param cls 要启动的Activity的类
*/
public static void startUserActivity(Context context , Class cls){
Intent intent = new Intent();
intent.setClass(context, cls);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
context.startActivity(intent);
}
至此,相信能解决大多数人遇到的问题了。
但是,要是intent跳转的时候是直接调用的第三方jar包或者aar呢?显然,我们是无法像上面那样设置的。尤其在Flutter插件开发中,Activity与Context的使用问题,需要注意,比如:
private void login(Result result) {
Map<String,Object> resultMap = new HashMap<>();
UniSDK.getInstance().login(activity, Constants.APP_ID, Constants.SECRET_KEY, new LoginCallback() {
@Override
public void onSuccess(String s) {
Log.e(TAG, "===============================================");
Log.e("onSuccess ==>", s);
Log.e(TAG, "===============================================");
activity.runOnUiThread(
new Runnable() {
@Override
public void run() {
resultMap.put(Constants.LOGIN_RESULT_KEY,"true");
resultMap.put(Constants.LOGIN_DATA_KEY,s);
String resultSuccess = JSON.toJSONString(resultMap);
result.success(resultSuccess);
}
});
}
@Override
public void onFailed(String s) {
Log.e(TAG, "===============================================");
Log.e("onFailed ==>", s);
Log.e(TAG, "===============================================");
activity.runOnUiThread(
new Runnable() {
@Override
public void run() {
resultMap.put(Constants.LOGIN_RESULT_KEY,"false");
resultMap.put(Constants.LOGIN_DATA_KEY,s);
String resultFailed = JSON.toJSONString(resultMap);
result.success(resultFailed);
}
});
}
}, getLoginUiConfig());
}
我出现这个问题的原因就是:调用“ UniSDK.getInstance().login()”方法的时候,出入了的上下文对象传入了“activity.getApplicationContext()”,导致三方的SDK中接收到的对象是Context,因此出现了上面的问题。
所以,将activity.getApplicationContext() 改为“activity”之后,问题也就解决了。
总结:
由此,可以总结出这个问题的两种解决思路:
1.按照异常提示信息,既然intent跳转需要添加新的task,那我们就在intent跳转时候添加“ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );”
2.另外一种是:当无法直接设置intent时,尝试将当前的上下文对象转化为activity,因为我们知道:Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用Activity的startActivity方法,不会有任何限制,这样的思路也可以借鉴。
因此,归纳起来就是:从正反两个方向入手去解决问题。