获取 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 文件,可以看出一套规律:全部内部类编译后都会生成字节码文件,但是匿名内部类有个特点

  1. 成员内部类:外部类名后加一个 dollar 接内部类名

  2. 静态内部类:和成员内部类一样(毕竟都是外部类的成员,静态非静态而已)

  3. 局部内部类:在 dollar 后比成员内部类多了个数字

  4. 匿名内部类:dollar 后只有一个数字,如果使用 lambda 表达式创建匿名内部类将不生成 class 文件,否则会生成。

其次,局部内部类和不使用 lambda 表达式创建的匿名内部类,他们的 class 文件名都包含数字,数字究竟是什么含义?

详情点击参考文章

WindowManagerGlobal

一个进程只有一个 WindowManagerGlobal 实例,维护当前进程中已经添加到系统中的窗口信息;会判断当前view 是否已经添加过,一个 view 只能被添加一次;

android:fitsSystemWindows属性

fitsSystemWindows

用于设置view在当前窗口的表现。一个app页面,包含:状态栏、标题栏、内容区、底部导航栏(比如有些手机的虚拟导航按键),如图:

整个界面可以看做是一个window,fitsSystemWindows 生效的前提是状态栏(StatusBar)或导航栏(NavigationBar)透明并且不能有标题栏,默认fitsSystemWindows = true,表示页面布局(内容区)不会扩展到状态栏,会针对透明的状态栏会自动添加一个值等于状态栏高度的paddingTop;针对透明的系统导航栏会自动添加一个值等于导航栏高度的paddingBottom,当fitsSystemWindows = false时,表示页面布局(内容区)扩展到状态栏,设置代码如下:

<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<!--透明状态栏-->
<item name="android:windowTranslucentStatus">true</item>
</style>

为布局view设置:

android:fitsSystemWindows="false"

效果如下:

总结:

  1. fitsSystemWindows 生效前提:当前页面没有标题栏,并且状态栏或者底部导航栏透明

  2. fitsSystemWindows = true,表示内容区不延伸到状态栏或底部导航栏

  3. fitsSystemWindows = false,表示内容区延伸到状态栏或底部导航栏

Android Intent.FLAG_ACTIVITY_NEW_TASK

熟悉Android委托机制的应该知道,这个mBase实际指向的是ContextImpl这个类,我们再来看这个类中的startActivity方法

@Override
public void startActivity(Intent intent, Bundle options) {
warnIfCallingFromSystemProcess();
if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
+ " Is this really what you want?");
}
mMainThread.getInstrumentation().execStartActivity(
getOuterContext(), mMainThread.getApplicationThread(), null,
(Activity) null, intent, -1, options);
}

注意看上面的这段代码:if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0)
如果intent中没有添加FLAG_ACTIVITY_NEW_TASK这个属性,那么就会报错。
这也是为什么在Service中调用startActivity和在BroadcastReceiver(静态注册)中通过onReceive传递过来的context.startActivity时(该context类型为ReceiverRestrictedContext,和Service一样,都没有重写startActivity),如果不加FLAG_ACTIVITY_NEW_TASK的话会报如下错误的原因.

那到这里可能就有疑问了,为什么在Activity中不加FLAG_ACTIVITY_NEW_TASK调用startActivity时不会报错呢。原因是因为Activity重写了ContextWrapper中的startActivity方法

@Override
public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
// Note we want to go through this call for compatibility with
// applications that may have overridden the method.
startActivityForResult(intent, -1);
}
} public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options); }

可以发现,里面是没有加FLAG_ACTIVITY_NEW_TASK判断的。

现在在回到开头,FLAG_ACTIVITY_NEW_TASK从字面上来理解,意思是:把将要启动的Activity放在一个新栈中,既然是新栈,那它的taskId和启动它的Activity所在的taskId肯定是不一样的。

————————————————
版权声明:本文为CSDN博主「仰子瞻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010389391/article/details/78558475

它们的TaskId竟然是一样的,在同一个栈中,说好的new_task呢?
原来这个这个属性,还有不少隐藏的信息,它的原则是:设置此状态,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样),如果有,则直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。

原来如此,因为我们是在同一个应用中进行Activity跳转的,所以它不会创建新的Task。那现在试一下在不同的应用中跳转看看,先创建两个module

 

Android 小知识点笔记的更多相关文章

  1. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  2. Android 小知识点(持续更新)

    ①文件保存默认是private权限. ②在layout的xml文件中onClick的方法中包含一个View类型的参数 ③获取项目下files路径:Context.getFilesDir(); ④获取项 ...

  3. web前端几个小知识点笔记

    1.css实现宽度是百分比的盒子为正方形 <div style="width:50%;padding-bottom:50%;height:0px;background:#ccc;&qu ...

  4. Http相关小知识点笔记咯~

    协议 先来说说什么是协议,协议其实指的是通信协议(Communications Protocol),也称传输协议.Wiki中的描述的是这样的,通信协议定义了通信中的语法学,语义学和同步规则以及可能存在 ...

  5. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  6. Android群英传笔记——第五章:Android Scroll分析

    Android群英传笔记--第五章:Android Scroll分析 滑动事件算是Android比较常用的效果了,而且滑动事件他本身也是有许多的知识点,今天,我们就一起来耍耍Scroll吧 一.滑动效 ...

  7. Android群英传笔记——第十章:Android性能优化

    Android群英传笔记--第十章:Android性能优化 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质 ...

  8. Android群英传笔记——第九章:Android系统信息和安全机制

    Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个 ...

  9. Android群英传笔记——第七章:Android动画机制和使用技巧

    Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...

随机推荐

  1. Andrew Ng机器学习算法入门((七):特征选择和多项式回归

    特征选择 还是回归到房价的问题.在最开始的问题中,我们假设房价与房屋面积有关,那么最开始对房价预测的时候,回归方程可能如下所示: 其中frontage表示的房子的长,depth表示的是房子的宽. 但长 ...

  2. Conda基本使用方法

    anaconda/miniconda的安装 请点击查看我的博客 本教程全部命令操作均在CMD(win).terminal(win).终端(linux/Macos)中执行 使用前配置 因为anacond ...

  3. python通过字符串定义函数名

    记录python里的一个有意思的小技巧:通过字符串定义函数名称. import sys m=sys.modules[__name__] def temp(x): return x+1 setattr( ...

  4. Windows 程序自动更新方案: Squirrel.Windows

    Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...

  5. 用fread和fwrite实现文件复制操作

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char ...

  6. 【BUAA软工】第一次团队作业——团队介绍

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:团队介绍与采访往届团队 团队作业-团队介绍和采访 Part I 团队成员介绍 有图有真(jia)相 大名 个人介绍 角色意向 李PX 来 ...

  7. nohup /usr/local/node/bin/node /www/im/chat.js >> /usr/local/node/output.log 2>&1 &

    nohup和&后台运行,进程查看及终止   &后台运行 登出ssh终端,进程会被自动kill掉 但是nohup >>XX.log 2>&1 & 登出终 ...

  8. 有没有一种组合字体,中文是宋体,英文是times new roman?

    有没有一种组合字体,中文是宋体,英文是times new roman? 由于日常科研工作书写需要,想问问各位大神有没有一种字体,中文是宋体,西文是times new roman,这样写论文好方便啊有没 ...

  9. Linux基本原则

    Bash特性 Shell shell(外壳),广义的shell可以理解为是用户的工作环境,在windows看来桌面就是一个shell,在linux看来终端就是shell 常见的shell有两种,一种是 ...

  10. WPS2019党政机关单位版(无广告困扰)

    WPS2019党政机关单位版(无广告困扰) 科技趣闻 ​ 中国石油大学(华东) 控制科学与工程硕士 17 人赞同了该文章 导读 WPS Office 2019专业版机关版是由WPS官方专为企业.机关单 ...