Android:Calling startActivity() from outside of an Activity? context requires the FLAG_ACTIVITY_NEW_

概述:
最近在开发一个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方法,不会有任何限制,这样的思路也可以借鉴。

因此,归纳起来就是:从正反两个方向入手去解决问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易小四

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值