w1764662543
淡定的人O
2019-04-25 17:44
采纳率: 66.7%
浏览 378

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;
    }
    ......
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • w1764662543
    淡定的人O 2019-05-02 14:15
    已采纳

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

    点赞 评论
  • weimingjue
    王能 2019-04-26 14:09

    这是一个多继承的问题
    还有你要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比较重要直接写成抽象类了更方便

    点赞 评论
  • qq_41613281

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

    点赞 评论

相关推荐