toolbar左边空白问题
这段代码会自动将toolbar里面的起始间隔设置为16dp,如何解决呢?有两种解决办法,其一,继承toolbar的theme主题,重写contentInsetStart为0dp;其二是在toolbar里面设置
但是这句必须写到apptheme的后面才生效
Android屏幕亮度问题
- 系统亮度,亮度值分为0~255,获取系统亮度
- 当前屏幕亮度,0.0~1.0的浮点型,根据系统亮度调节当前屏幕亮度
brightness==-1的判断是将-1作为一个标志位,标志当app设置中包含"跟随系统亮度"或者"恢复系统亮度"的时候,我们传递一个-1参数,这时将screenBrightness参数还原成默认数值(跟随系统)即可
StringBuilder清空方法
StringBuilder是一种可变字符串类,提供缓存的;但是此类没有明确提供清空字符串的方法,只能通过调用类似方法达到目的,方法有三:
(1)重新new一个StringBuilder,由垃圾回收器回收处理
(2)sb.delete(start,end)删除从头到尾
(3)sb.setLength(int),设置长度为0
三种方法里面,第二种效率更改
try(){}catch{}新特性
JDK1.7后try catch新语法,可以try()里面可以写一些IO流的赋值创建操作,在try语句结束后,会自动关闭IO流,不用自己在手动处理关闭;
可以作为GCROOT的对象节点
常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC roots且没有被GC roots引用的对象。
一个对象可以属于多个root,GC root有几下种:
Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots
- Thread - 活着的线程
- Stack Local - Java方法的local变量或参数
- JNI Local - JNI方法的local变量或参数
- JNI Global - 全局JNI引用
- Monitor Used - 用于同步的监控对象
- Held by JVM - 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此就只有留给分析分员去确定哪些是属于"JVM持有"的了。
JNI部分
C++语法
std::nothrow标准库
即普通new和标准头文件里面的new(nothrow new),早起的C++环境new分配内存失败返回0,在某些特定的环境又会返回NULL空指针的情况,为了防止两种情况下返回不同的值,C++委员会规定了一个新版本的new,也就是nothrow new,此版本分配失败返回0;不要以为这个可有可无,在某些情况下,分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。因此,应用程序开发者在这个环境中使用nothrow new来替代普通的new是非常安全的。
dynamic_cast
由基类强制转换为子类,在运行状态时,如果基本实例的确是派生类的实例,dynamic_cast将强制转换为子类;反之,则返回空指针
jni调用java方法
java方法调用jni想必都知道,但是jni调用却不一定清楚;jni调用java步骤有三
- jni的FindClass找到java对象的实例
- 通过java实例找到方法methodId
- 最后利用java对象实例和methodId调用方法
例子:
最后一步调用java方法,jni提供了更多的方法接口:
jni日志打印
1、在JNI的实现代码文件(.c或者.cpp)中加入包含LOG头文件的如下代码:
2、在需要打印的方法中添加打印代码,例如:
ANDROID_LOG_INFO:是日志级别;
“JniX431FileTest”:是要过滤的标签,可以在LogCat视图中过滤。
“lsx_init”:是实际的日志内容。
3、在Android工程的Android.mk文件中添加如下内容:
Android的assets资源和raw资源
众所周知,assets和raw目录下的资源时不经过编译直接合入到最终的apk包里面去,两者的区别是,存放内容大小不一样和访问方式不一样,其他都是一样的;如果是这样的话,那么我们是不是可以直接把资源放到apk里面去在签上名就可以用了?
答案是否定的,为什么呢?
因为aapt在编译的时候,虽然不编译压缩这些资源,但是会把这些文件的状态,位置描述存放到sqlite数据库里面去,到时候你在java代码里面使用时就会重数据库里面找到这些文件位置信息,在去提取;