2017.7.18
GridView和ListView采用回收机制,简单地说:如果屏幕最多可以显示n个子View,那么内存中其实就只有这n个子View。当 滚动了之后,重新展现在屏幕的n个View是复用了之前的n个View。所以在GridView和ListView中,getChildAt(int position)方法中的position指的是当前可见的第几个子View。如果要获得GridView或ListView的第n个子View,那么position就是n-第一个可见子View的位置:
View view = listView.getChildAt(n - listView.getFirstVisiblePosition());
2017.8.23
入坑各种加密方式:由于需求特殊,加密后的字符串大小不能增加,所以采取了字符串位移运算或异或加密方式,一开始加密函数实现是用String作为参数,返回值类型也是String,测试中发现中文字符串加密后再解密是乱码。原因是中文字符的字节数据经过异或后会变成无效的UTF-8编码,然后将异或后的字节数据转String获取到错误的字符串,之后再解密该错误的字符串,所以就不能正确还原成原先的字符串。
解决办法:不使用getbytes(),而使用string的toCharArray()。toCharArray()返回的是"自然字符"。但是这个"自然字符"的数目和内容却是由原始的编码方式决定的。
如果我们使用new String(str.getBytes(), encoding)对字符串进行重新编码解码时,我们一定要清楚str.getBytes()方法返回的字节数组的长度、内容到底是什么,因为在接下来使用新的encoding进行编码解码时,Java并不会自动地对字节数组进行扩展以适应新的encoding。而是按照新的编码方法直接对该字节数组进行解析。
2017.9.04
在体验Android studio 3.0 Canary 8的时候,发现使用butterknife7.0.1时会报如下错误:
Error:Execution failed for task ':app:javaPreCompileDebug'.
Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.
- butterknife-7.0.1.jar
Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.
经过一番谷歌后,解决办法如下:
在app.build中添加这么一句就可解决:
android{
defaultConfig{
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
}
}
2017.9.19
Android 6.0 关于Wi-Fi的改变
在官网中,介绍了关于Android 6.0有关WiFi的变化。
2017.9.29
- JAVA中日期:
yyyy-MM-dd HH:mm:ss 返回24小时制的时间格式
yyyy-MM-dd hh:mm:ss 返回12小时制的时间格式 - 在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intentdata)方法(不论你有没有显示调用setResult)
2017.10.25
自android 2.1版本开始,存放资源图片的文件夹由原来的一个drawable文件夹变成了drawable-hdpi、drawable-mdpi和drawable-ldpi,这是为了支持不同终端设备的不同分辨率。
drawable-hdpi、drawable-mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA(480x800),FWVGA(480x854)
(2)drawable-mdpi里面存放中等分辨率的图片,如(320x480)
(3)drawable-ldpi里面存放低分辨率的图片,如QVGA(240x320)
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片,同一资源的不同分辨率的图片应该命以相同的名称存放在不同的资源图片文件夹中。
2017.12.13
在使用SqliteDatabases的replace API时需注意:
如果在新替换的记录中, 有字段和表中的其他记录冲突, 那么会删除那条其他记录。(遵守唯一约束)
如果要使用replace,一定要有一个primary key,并且,该字段,是唯一区分到底是应该被update还是应该被insert的条件。
参考文章:
Sqlite3中replace语句用法详解
在Sqlite中通过Replace来实现插入和更新
android sqlite 完全用replace替代 insert 和 update 操作
2018.1.2
android sqlite db-journal文件产生原因及说明
2018.1.25
在使用Findbugs插件来检查代码bug时,发现大篇幅的报Non-transient non-serializable instance field in serializable class错误。在仔细研究了下后,找到了解决方法,在这里分享一下
结论:
1、如果要可序列化某个类,需要实现Serializable接口
2、为确保序列化与反序列化一致,UID必须不可改变
3、如果不需要序列化成员变量,那么可以将这个变量标为瞬时的,修饰符:transient
4、如果需要序列化成员变量的引用,那么这个引用也需要实Serializable接口
2018.2.27
BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。
2018.3.13
创建Dialog和启动Activity所需的上下文为什么必须是Activity?
出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
而要启动一个目标Activity的context是非Activity类型,则需要设置TAG Task,即FLAG_ACTIVITY_NEW_TASK。其实,意思是,如果我们想要启动一个Activity,启动它的context必须要有一个任务栈。
网友评论