Jlog

Coding, thoughts. @Android笔记

Latest

Android 上的低功耗蓝牙实践

这是我在 Droidcon Beijing 2016 和 GDG Devfest 2016 上做的分享,以下是正文: Slide 01 我今天分享的主题是 Android 上低功耗蓝牙的实践。这个主题比较小众。我在过去的一年多的时间里,主要是在做低功耗蓝牙相关的开发。接触过程中发现,BLE 的开发和通常的 Android APP 的开发有点不一样,这里需要访问硬件资源,而且涉及到一些协议相关的内容,而且这方面的资料也比较少。今天我从 Android 开发者的角度,来分享一下低功耗蓝牙开发实践。 Slide 02 今天分享的内容,主要包含如下几个部分:首先对蓝牙和低功耗蓝牙做一个简单的介绍;然后介绍 Android 上对低功耗蓝牙的支持;再介绍一下在 Android 平台上可以开发哪些低功耗蓝牙应用;然后是,开发过程中,可以帮助我们调试的工具;最后,总结一下所谓的 “最佳实践”,低功耗蓝牙开发的一些小经验。 Slide

By Race604

React Native 触摸事件处理详解

触控是移动设备的核心功能,也移动应用交互的基础,Android 和 iOS 各自都有完善的触摸事件处理机制。React Native(以下简称 RN)提供了一套统一的处理方式,能够方便的处理界面中组件的触摸事件、用户手势等。本文尝试介绍 RN 中触摸事件处理。 1. RN 基本触摸组件 RN 的组件除了 Text,其他组件默认是不支持点击事件,也不能响应基本触摸事件,所以 RN 中提供了几个直接处理响应事件的组件,基本上能够满大部分的点击处理需求TouchableHighlight, TouchableNativeFeedback, TouchableOpacity 和 TouchableWithoutFeedback。因为这几个组件的功能和使用方法基本类似,只是 Touch 的反馈效果不一样,所以一般我们用 Touchable** 代替。Touchable** 有如下几个回调方法: * onPressIn:点击开始; * onPressOut:点击结束或者离开; * onPress:单击事件回调; * onLongPress:长按事件回调。 它们的基本使用方法如下,

By Race604

React Native 中 ScrollView 性能探究

1 基本使用 ScrollView 是 React Native(后面简称:RN) 中最常见的组件之一。理解 ScrollView 的原理,有利于写出高性能的 RN 应用。 ScrollView 的基本使用也非常简单,如下: <ScrollView> <Child1 /> <Child2 /> ... </ScrollView> 它和 View 组件一样,可以包含一个或者多个子组件。对子组件的布局可以是垂直或者水平的,通过属性 horizontal=true/false 来控制。甚至还默认支持“下拉”刷新操作。另外还有一个特别赞的特性,超出屏幕的 View 会自动被移除,从而节省资源和提高绘制效率。我们来看如下一个例子: class

By Race604

30 天入门 Android 开发, Google 与你一起圆梦

经常会有朋友让我推荐 Android 开发入门的教程或者视频,我一直是推荐看官方的教程。大部分人或者觉得比较迷茫,或者觉得坚持不下去。这次推荐这个《30 天入门 Android 开发》是 Google 亲自发起的免费教学,以学习小组方式,大家可以一起学习和交流。一个好的开始,是成功的一半。让 Google 工程师带领你一起进入多彩的 Android 开发大门。点击这里 报名。 Android 设备已经随处可见,你想尝试一下在 Android 设备上的开发和创新吗?快来跟随 Google 的步伐,一起学习 Android 入门课吧! Google Study Jams 活动介绍 Study Jams 是一个学习 Google 在线课程的活动。该活动由学员自主发起课程学习小组,带领小组成员入门 Android 开发,最终将

By Race604

Java 单例真的写对了么?

单例模式是最简单的设计模式,实现也非常“简单”。一直以为我写没有问题,直到被 Coverity 打脸。 1. 暴露问题 前段时间,有段代码被 Coverity 警告了,简化一下代码如下,为了方便后面分析,我在这里标上了一些序号: private static SettingsDbHelper sInst = null; public static SettingsDbHelper getInstance(Context context) { if (sInst == null) { // 1 synchronized (SettingsDbHelper.class) { // 2 SettingsDbHelper inst = sInst; // 3 if (inst == null) { // 4 inst = new Settin

By Race604

更优雅的 Android 发布自动版本号方案

以前看到一些自动化版本号打包的文章。如果您的项目是用 Git 管理的,并且恰巧又是使用 Gradle 编译(应该绝大部分都是这样的了吧?),本文试图找到一种更加优雅的自动版本管理方法。 1 背景 我们都知道,Android 应用的版本管理是依赖 AndroidManifest.xml 中的两个属性: * android:versionCode:版本号,是一个大于 0 的整数,相当于 Build Number,随着版本的更新,这个必须是递增的。大的版本号,覆盖更新小的版本号; * android:versionName:版本名,是一个字符串,例如 "1.2.0",这个是给人看的版本名,系统并不关心这个值,但是合理的版本名,对后期的维护和 bug 修复也非常重要。 在使用了 Android Studio 或者

By Race604

FlatBuffers 体验

1. 背景 最近在项目中需要使用一种高效数据序列化的工具。碰巧在几篇文章中都提到了 FlatBuffers 这个库。特别是 Android 性能优化典范第四季中两个对比图,让我对它产生浓厚的兴趣。如下: (注:图片来自) 可见,FlatBuffers 几乎从空间和时间复杂度上完胜其他技术,我决定详细调研一下此技术。 FlatBuffers 是一个开源的跨平台数据序列化库,可以应用到几乎任何语言(C++, C#, Go, Java, JavaScript, PHP, Python),最开始是 Google 为游戏或者其他对性能要求很高的应用开发的。项目地址在 GitHub 上。官方的文档在 这里。 本文将介绍一下我使用 FlatBuffers 的一些感受,希望对想要了解或者使用 FlatBuffers 的同学有一点帮组。 2. FlatBuffer 的优点 FlatBuffer 相对于其他序列化技术,例如 XML,JSON,Protocol

By Race604

[第 30 期] Android 周报

文章/教程 1. Android 绘制流程 文章梳理了 Android 中从 Activity 创建到 View 显示的整个流程,作为一个大纲性质的文章,对理解 Android 的显示有很大的帮助。 2. Android UI 性能优化详解 这篇文章翻译自 High Performance Android Apps 这本书,本文介绍了 Android 中 UI 的性能问题产生的原因,更重要的是介绍了官方的所有的 UI 性能调试和检测工具的使用方法,是非常好的一篇实战文章。 3. Android 性能优化典范(四) 这是 Android 官方团队发布的性能优化课程第 4 季的文字版,感谢 @胡凯 一如既往的严谨总结。文章中提到的小点,都是非常实用和有效的。 4.

By Race604

Android targetSdkVersion 原理

前几天 Google 官方发布文章解析 compileSdkVersion、minSdkVersion 以及 targetSdkVersion 的含义,以及合理设置各个值的意义,原文 Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion(后面简称 “原文”),还有翻译版。 其中,compileSdkVersion 和 minSdkVersion 都非常好理解,前者表示编译的 SDK 版本,后者表示应用兼容的最低 SDK 版本。但是对于 targetSdkVersion 其实很难一句话解析清楚,原文用了“万能”的词 —— interesting 来描述。以前我也有一些迷糊,看到有些人和我有同样的困惑,本文试图彻底解决这个问题。 原文是这么说的: targetSdkVersion is the main way Android provides forward

By Race604

我的 2015

很久就计划要写一篇总结 2015 年的文章,一直到现在,还有几个小时就到 2016 年了,才开始写,可见拖延症越来越严重了。这样的图每年都会出现,确实也戳中了很多人,也包括我。 当我静下来想写一些东西的时候,竟然想不起我这一年干了些啥。 今年的工作比较稳定,工作上的事情还算顺利。 很早就计划用博客来记录技术学习,用微博来记录小知识点。博客只有这一年坚持了下来,一共写了 80 多篇,平均每周一到两篇,也收到不少的关注或者点击,我自己在这件事情中受益很大,很多时候会翻阅自己以前的文章来解决或者帮助别人解决问题。微博的关注者从几百到现在九千多,也是一个奇迹。 今年,开始在 GitHub 上发布开源项目,FlyRefresh 和 ZhiHuDaily-React-Native 都接近了 2k 的 star,开始几天竟然冲到了 Trending 总榜第一。能得到很多人的认同,也有不少未曾谋面的朋友发来邮件交流和指出问题。倍感荣幸的同时,也逐渐意识到需要写好每一行代码。 因为比较宅,接触新朋友的机会比较少,今年却非常开心的事情认识了一群很有趣的朋友。因为“

By Race604

[第29期]Android周报

文章/教程 1. Android 打包的那些事 我们都知道 Gradle 的功能很强大,但是具体能干啥呢?本文主要写了 Gradle 中非常实用的小技巧,也是一个实际使用 Gradle 的启发。 2. 让App像Web一样发布新版本 这是一个 Android 应用的热修复的解决方案,利用的 Android 支持的多 Dex 包的原理,把修复的类打包到一个单独的 Dex 包中,然后把此 Dex 包插到 ClassLoader 的前面,让它先找到这个修复类,达到替换原来的类的目的。同时也出了解决方案:Nuwa 和 DroidFix。 3. Android 快捷方式解密 这是最全的 Android 创建 Launcher 快捷方式的方法,能解决和适配各种 ROM/Launcher

By Race604

React Native 中组件的生命周期

概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle)。所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键。RN 组件的生命周期整理如下图: 如图,可以把组件生命周期大致分为三个阶段: * 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化; * 第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组件可以处理用户交互,或者接收事件更新界面; * 第三阶段:是组件卸载消亡的阶段,如图中右下角的虚线框中,这里做一些组件的清理工作。 生命周期回调函数 下面来详细介绍生命周期中的各回调函数。 getDefaultProps 在组件创建之前,会先调用 getDefaultProps(),这是全局调用一次,严格地来说,这不是组件的生命周期的一部分。在组件被创建并加载候,首先调用 getInitialState(),来初始化组件的状态。 componentWillMount 然后,准备加载组件,会调用 compon

By Race604