获取 view 的位置
View.getLocationInWindow(int[] location)
一个控件在其父窗口中的坐标位置
View.getLocationOnScreen(int[] location)
一个控件在其整个屏幕上的坐标位置
getLocationInWindow是以B为原点的C的坐标
getLocationOnScreen以A为原点。返回的都是左上角的位置。
Activity 类的 super.overridenMethod() 调用顺序
知道 Java 语言规范没有指定调用 super.overridenMethod() 必须放置的顺序(或者如果必须放置调用)。
在 Activity 类的情况下,super.overridenMethod()调用是必需的并强制:
-
对于创建半周期 onCreate,onStart 和 onResume,建议先调用 super.overridenMethod(),这样可以确保你在操作自己的逻辑时候,activity 已经准备好了,不会出现异常情况;
-
对于销毁半周期:onPause,onStop,onDestroy,建议先做自己的逻辑,最后再调用 super.overridenMethod(),这样可以确保调用你得方法时候,activity 没有销毁你可能需要用到的东西,避免出现错误。
包含内部类的.java文件编译后生成几个.class文件
如果一个类有内部类,编译将生成几个字节码文件,规则是怎样呢?
写在前,自己动手丰衣足食,结论只有个人实验支持,没有官方数据支持,欢迎自行查阅文档然后来指正。
普通类包含内部类的样例
public class Test319 { private static class StaticInner{ }//静态内部类 private class Inner{}//成员内部类 public void outerFunction1(){ class PartInner3{}//局部内部类3 } public void outerFunction2(){ class PartInner1{}//局部内部类1 class PartInner2{}//局部内部类2 } public Thread thread1 = new Thread(new Runnable() {//匿名内部类1 @Override public void run() { } }, "thread1"); public Thread thread2 = new Thread(new Runnable() {//匿名内部类2 @Override public void run() { } }, "thread2"); public Thread thread3 = new Thread(()->{//匿名内部类(使用lambda表达式) },"thread3"); }
2.编译后生成的文件目录
总结
首先,包括外部类在内一共有 9 个类,而目录中只有 8 个 class 文件,可以看出一套规律:全部内部类编译后都会生成字节码文件,但是匿名内部类有个特点
-
成员内部类:外部类名后加一个 dollar 接内部类名
-
静态内部类:和成员内部类一样(毕竟都是外部类的成员,静态非静态而已)
-
局部内部类:在 dollar 后比成员内部类多了个数字
-
匿名内部类:dollar 后只有一个数字,如果使用 lambda 表达式创建匿名内部类将不生成 class 文件,否则会生成。
其次,局部内部类和不使用 lambda 表达式创建的匿名内部类,他们的 class 文件名都包含数字,数字究竟是什么含义?
详情点击 参考文章
WindowManagerGlobal
一个进程只有一个 WindowManagerGlobal 实例,维护当前进程中已经添加到系统中的窗口信息;会判断当前view 是否已经添加过,一个 view 只能被添加一次;