Context 创建过程

Application Service Activity 里的context 通过ContextImpl创建得到的,继承图:

应用中的context数量:activity + service + 1

正确使用Context

一般Context造成的内存泄漏,几乎都是当Context销毁的时候,却因为被引用导致销毁失败,而Application的Context对象可以理解为随着进程存在的,所以我们总结出使用Context的正确姿势:

1:当Application的Context能搞定的情况下,并且生命周期长的对象,优先使用Application的Context。

2:不要让生命周期长于Activity的对象持有到Activity的引用。

3:尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。

参考:

Context创建过程解析 - 简书 (jianshu.com)

Context都没弄明白,还怎么做Android开发? - 腾讯云开发者社区-腾讯云 (tencent.com)

Dialog对应的Context

不一定是Acitivity,可以是Application 或者 service类型的context,非Activity类型的context需要通过windowmanager.type设置类型

自定义dialog,构造方法里进行设置

    private void initConfig() {
        Window window = getWindow();

        android.view.WindowManager.LayoutParams params = new android.view.WindowManager.LayoutParams(
                android.view.WindowManager.LayoutParams.MATCH_PARENT,
                android.view.WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.TYPE_VOLUME_OVERLAY,
                android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                PixelFormat.TRANSPARENT);

        params.gravity = Gravity.START | Gravity.TOP;
        params.x = 0;//anchorRect.centerX() - mRootView.getLayoutParams().width / 2;
        if (window != null) {
            window.setAttributes(params);
        }
        setCancelable(true);
        setCanceledOnTouchOutside(true);
    }

参考:

Android老司机被打脸!Dialog 对应的 Context 必须是 Activity吗? - 腾讯云开发者社区-腾讯云 (tencent.com)

 

posted @ 2022-11-18 15:28  随易来了  阅读(40)  评论(0编辑  收藏  举报