Android:ApplicationContext远非Context

一:前言

    ApplicationContext和Context完全不是一个东西,关于它们的一些介绍各位小伙伴可以先看我的一篇博文浅析Android Context,今天在写代码的时候,突发奇想,验证了自己的一个想法,又发现了ApplicationContext和Context不同的强力佐证,并查找资料做了些探索,故总结如下。

二:代码实现

    点击一个Button,在主Activity中去启动SecondActivity,代码非常简单,简写如下:

bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });

    假设我把startActivity(intent)替换成getApplicationContext().startActivity();就会出现android.util.AndroidRuntimeException错误:

Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.Is this really what you want?
    这是因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context,如ApplicationContext并没有所谓的任务栈,所以这就会出现问题,解决问题的方法使给intent设置上一个标记位,既:

bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getApplicationContext().startActivity(intent);
            }
        });
    这时候用getApplicatioContext再次启动Activity就不会出现问题了,因为我们显示的指示了启动它时为它创建一个新的任务栈,细心的小伙伴可能会发现,指定Flags后的启动方式,就相当于singleTask模式启动了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值