Android 开发生僻却实用的知识点

来源:互联网 发布:zk java客户端 编辑:程序博客网 时间:2024/06/05 03:03

我所在的 WillowTree 的 Android 开发团队素来会在 Slack channel 上每周开设一个小课程分享自己新学到的生僻技巧,秉着分享,开源的思想,从今天开始我会在本博客连载一个“Android 开发生僻却实用的知识点”专栏博文,用以分享我们所了解到的知识点。

不仅如此,我们还鼓励任何人来参与这个课程,分享他们的所知所得(尽管他们要分享的东西是显而易见的,抑或是早就被分享过了),因为不管怎样,他们都会让关注这个课程的人学习到一些知识。在这个课程中,有一些技巧你可能早就知道了,但总有一些你是不知道的。但无论如何,我们希望在这个课程中分享的开发技巧能够帮助观看的人提升写代码的能力,也希望你能从中获益。随意在下边的留言板留言提问哈,我们会回答你的问题的。

Tidbit One

你知道 Android Studio 有一个 asset 生成器可以生成常用的 Action Bar 图标么?要用这个功能能简单,只需要点击:

[File] >[New] >[Image Asset]

Tidbit 2

你需要单独运行一个 Gradle 测试?运行下面的代码吧:

Tidbit 3

在开发应用的过程中使用 Strict 模式以确保我们没有在主线程做某些不该做的事情(如耗时任务,网络访问等……),但要注意的是,应用的非 Debug 版本,即 Release 版本所用的代码必须把 Strict 模式关掉,要不然会影响应用性能甚至导致崩溃。

http://developer.android.com/reference/android/os/StrictMode.html

Tidbit 4:

在使用 Picasso 的时候可以设置 RequestTransformer 以修改请求的 Url。例如,我们可以添加图片的宽高到 Url 参数中。

Tidbit 5:

如果你有在 manifest 中为某一个 Activity 设置 android:windowSoftInputMode=”adjustResize”,那么 ScrollView(或其他可以滚动的 ViewGroup)会收缩以显示软键盘。但如果你在 Activity 的 Theme 中设置了 android:windowFullscreen=”true”,ScrollView 就不会这样了,因为此时 ScrollView 已经被甚至为填充满整个屏幕。此外,在 Theme 中设置 android:fitsSystemWindows=”false” 也会使 adjustResize 失效。

Tidbit 6

在应用的运行过程中如果 Android 系统决定要更新系统的 WebView,那你的应用可能会发生崩溃,详细的问题请戳我

Tidbit 7

Material Design 中有对 padding 和 margin 的要求,除非你是专业的交互设计师,懂得 padding 在什么情况下取什么值才是正确,什么时候是错误的,而且有注意到在这个知识点中,单词间的间距是两个空格,那你可以下载这个 App,并研究其中的细节,了解清楚之后再看看你的 App,看看哪些部分是不符合规范的。

Tidbit 8

即使你已经在 Adapter 里将 List 中的某一项 Item 移除,getChildLayoutPosition 还是会返回 position 值,这是因为被移除的 View 可能还处于显示移除动画的状态,因此还存在于 RecyclerView 之中。

Tidbit 9

GET_ACCOUNTS 这个运行时权限不能通过权限页面将它在 API-23 之前的设备中设置为关闭(事实上,如果这是联系人组里唯一的权限,你甚至不能在联系人组里看到这个权限成为一个可选选项)。由于这个细节,假设 account 存在而导致的崩溃的例子实在太多了。

Tidbit 10

Chrome 改变了它处理深层链接的方式。现在我们不会因为在地址栏中输入一个 Url 而偶然地打开某个深层链接。举例来说,从前你能够在 Chrome 的地址栏中输入 pandora.com,然后会触发 Pandora 应用的打开,而不是直接打开该网页。在新的版本中,用户只会看到 Pandora 的网页。
intent:

例如:

专家建议:你可以在链接中添加回退 Url 和/或包名,在用户没有安装 App 时就能获得回退 Url。首先 Chrome 会检查是否有回退 Url,然后导航用户到该 Url。如果没有回退 Url,Chrome 就会寻找包名,使得用户会打开 Play Store,并进入对应包名的页面。如果用户没有安装该 App,而且没有回退 Url,就会出现404错误。

Tidbit 11

使用 23.0.0 开发库时使用 Loader 的话要注意:由于 Fragment 和 Activity 交互的方式被改变了,当手机方向改变,发生横竖屏切换时会发生一个 Bug,使 loader 被丢失。在 support 23.1.0 中这个 Bug 被修复了,然而,当 Loader 在子 Fragment 中被使用是,方向改变还是会出现这个 Bug。所以现在唯一的解决办法就是使用 23.0.0 之前的库。

Tidbit 12

在方法返回一个空集合的时候尽可能使用 Collections.emptyList() 和 Collections.emptySet()。Collection 类会返回一个单例空 list 或 set,这样我们就不需要总是创建新的空集合,浪费内存了。

Tidbit 13

如果你正在使用由 ZXing 开发的二维码生成器库来生成二维码,你会发现用它来生成大图片有点慢。但你可以换一种办法来生成大图片,如果你传递 0 x 0 的图片大小给库,它会返回一个最小尺寸的 BitMatrix (每一个块都是1像素)。然后你可以把该 Matrix 写入 BitmapDrawable,并将它设为某些 View 的背景。使用这个办法前确保已经对 Drawable 调用 setFilterBitmap(false),不然的话在缩放的时候图片会模糊。

由于我需要二维码的背景是透明的,所以我使用了 Bitmap.Config.ARGB_4444。如果你想让二维码只有黑白两种颜色,可以用 Bitmap.Config.RGB_565。如果你怕乱改会有什么麻烦,你可以把二维码的创建方法改为:BitMatrix matrix = new QRCodeWriter().encode(“content here”, BarcodeFormat.QR_CODE, 10, 10)。但有一点一定要注意,库可能在未来被更新为不接受 0 x 0 参数,毕竟二维码最小也不可能比 10 x 10 还小吧。

– Tidbit contributor, James Sun

Tidbit 14

键入 adb hell 和 adb shell 的结果是一样的

– Tidbit contributor, Tyler Romeo

Tidbit 15

TextUtils.concat() 能将连接输入的 CharSequences 连接在一起,并保持它们的间距,并且返回值仍为 CharSequences。

– Tidbit contributor, Walker Hannan

Tidbit 16

一般子 View 处理的点击事件都是由父 View 拦截并分发下来的,所以如果你需要使用某个子 View 正在处理的点击事件,就使用拦截事件的方法。如果子 View 调用了 setRequestDisallowInterceptTouchEvent,而你又不希望自己的拦截被禁止,那就重载 setRequestDisallowInterceptTouchEvent 这个方法吧。

– Tidbit contributor, Frank Doyle

Tidbit 17

在执行一些耗时操作的时候可以调用 SqliteDatabase 的 beginTransaction() 和 endTransaction() 方法,但要确保调用了 setTransactionSuccessful(),要不然在调用 endTransaction() 的时候你的操作作出的改变会被回滚。

– Tidbit contributor, Walker Hannan

Tidbit 18

如果你在添加测试用例,千万要小心使用静态方法!因为某些奇奇怪怪的原因,Android 框架层提供的很多方法在测试单元里根本不能用,而且由于它们是静态方法,你甚至不能模拟它们。

– Tidbit contributor, Frank Doyle

Tidbit 19

如果你在给应用添加测试用例,不妨试试 Mockito,它会大大简化你之前那些测试用例中复杂的对象依赖。

– Tidbit contributor, Frank Doyle




备注:此文章未完,后续持续更新。。。。。。。

0 0
原创粉丝点击