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)