Android应用程序Context数目问题

我们知道Application和activity,Service都是直接间接继承Context,

  • (2)为什么他们还会有一个Context对象,如下面的mBase?
  • (3)那么一个应用程序的所有context之和还会只是Application和activity,Service数 目之和吗?不应该是2*activity数目+2*Service数目+Application数目
public class ContextWrapper extends Context {
    Context mBase;
    ......
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }
    ......
}

我觉得这个比较有参考意义。纠结具体多少context并没有任何意义。
https://blog.csdn.net/mydots/article/details/44540543
一般都认为是:activity数目+Service数目+Application数目。虽然activity和service,application都间接继承context。但是仅仅用来维护其生命周期。内部context的成员变量才是我们想要的上下文对象。一般讨论context都是讨论他它

这是一个多继承的问题
还有你要context数目干嘛,谁都可以初始化一个,只要有base。

假设:service有加载图片+后台运行功能,Activity有加载图片+前台展示功能,Application有后台运行+前台展示功能。
这个时候你肯定会想到三个接口:加载图片接口、后台运行接口、前台展示接口然后他们分别实现即可
但这三个功能是一模一样,他们都得重写一遍,是不是很麻烦?
在c++里面大家肯定想到的是多继承,但java不支持
于是就有了一个中间者:ImgImpl、BackgroundImpl、FrontImpl这三个impl分别实现了上面的三个接口
然后service:初始化ImgImpl、BackgroundImpl,同时继承这2个接口,当调用对应的方法时直接调用Impl即可,不需要多写其他代码

    interface Img {
        void loadImg();
    }

    interface Background {
        void doBackground();
    }

    interface Front {
        void doFront();
    }

    class ImgImpl implements Img {
        @Override
        public void loadImg() {
            //加载图片
        }
    }

    class BackgroundImpl implements Background {
        @Override
        public void doBackground() {
            //后台操作
        }
    }

    class FrontImpl implements Front {
        @Override
        public void doFront() {
            //前台操作
        }
    }

    class Service implements Img, Background {

        private Img mImg;
        private Background mB;

        public void setImg(Img img) {
            mImg = img;
        }

        public void setBackground(Background b) {
            mB = b;
        }

        @Override
        public void loadImg() {
            mImg.loadImg();
        }

        @Override
        public void doBackground() {
            mB.doBackground();
        }
    }

当然如果仅仅就这2行代码肯定不至于这样,你可以看看contextImpl有多少代码以及Activity有多少接口就知道了。
context不是接口原因很简单:java可以有一个父类,context比较重要直接写成抽象类了更方便

首先Context类是一个抽象类,无法直接实例化,其次关于你这个问题,源代码中的mBase只是一个引用,它的值(也就是base)是在attachBaseContext方法中传递进来的,换言之,这里的mBase的值是函数回调时传递进来的,并非由创建出来,所以并不冲突,一个应用程序中的context之和等于Activity的数量+Service数量+1,这里的1就是Applicant的Context,一个静态变量,用于保存和同步APP全局的环境配置信息。