Race604

Android

Android 上的低功耗蓝牙实践

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

By Race604

React-Native

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

React Native 中 ScrollView 性能探究

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

By Race604

Android

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

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

By Race604

Android

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

更优雅的 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

Android

[第 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

Story

我的 2015

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

By Race604

Android Weekly

[第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

React Native 中组件的生命周期

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

By Race604

Story

独立博客终于回来了

网站风格又大变了,不要惊讶,这才是它本来应该的样子。 因为网站备案的原因,经历了博客从 Ghost 迁移到 Hexo,博客托管在 GitCafe 的 Pages 服务上面,到现在已经快两个月了。 今天终于收到消息通知网站备案通过了,终于又可以假设这个独立博客了。不是因为 Hexo + GitHub/GitCafe 不好,而是因为比较喜欢 Ghost。 以前因为 Feeds 不能用,也造成了很多困扰。现在博客的 Feeds 也回来了,可以直接订阅:RSS,也可以订阅周报。 关于评论,因为多说的评论迁移实在太麻烦了,因为那个 ThreadKey 不同导致没法迁移,最后还是放弃了,使用 Disqus 这个评论系统,Disqus 做的真的很好,基本不用配置,而且博文 URL 自动对应评论 Thread。 总之,

By Race604

Android

React Native for Android 发布独立安装包

昨天发布了 ZhiHuDaily-React-Native 项目,有不少人问有没有 APK 包来体验一下。做了 React Native Android 开发的话,就会知道,开发的时候必须启动个 JS Server,然后要让手机连接这个 Server,否者会出现那个"吓人"的红色屏幕。这个我在第一篇 React Native 文章中就提到过。 如果要发布一个 React Native 写的 Android 应用,不可能要别人来连接这个 JS Server。可不可以不要连接这个 Server 就能运行呢?在网上找了一圈,发现资料很少,官方文档上也没有说支持。这篇文章就来讨论一种实现方案。 原理探究 我们来看一下 RN 应用连接这个 JS Server 干了啥事情?第一次运行应用的时候,

By Race604

Android

React Native for Android 实践 -- 实现知乎日报客户端

React Native for Android 的发布,对一个 Android 开发者来说还是有相当的吸引力的。通过前面这篇博客:React Native for Android 入门老虎好不容易入了门了,然后想找一个简单的项目,来练练手。一方面来熟悉一下 RN(React Native, 后面都做此简写),另一方面来验证使用 RN 来实现一个相对完整的项目的可行性。 平时用的最多的客户端之一:知乎日报,这个 APP 相对简单,而且也找到了有人分析的知乎日报 API 分析。就选择它了:实现一个 React Native 版的知乎日报客户端,目标是尽量实现官方客户端一致的效果。 这篇文章主要讲使用 RN 来实现知乎日报客户端的可行性和实现方法。整个项目开源在 GitHub 上:ZhiHuDaily-React-Native,欢迎 Star 和 PR。 基本概念

By Race604

Android

React Native for Android 入门老虎

昨天期待已久的 React Native for Android 发布了,赶紧来尝试一下,我跟着这个 Getting Started 开开始入门。发现被一些 "老虎" 堵在门口, Hello World 都跑不起来,入不了 React Native 的门,让我很懊恼,最后终于解决。可能大家也会遇到类似的问题,这篇文章希望能帮到你。 安装环境 根据官方的入门文档,需要安装 Homebrew, nvm, Node.js 4.0, watchman, flow。 首先 Homebrew 大家应该都安装好了,这里就不说了。接下来实用 brew 安装 nvm: $ brew install nvm 然后会提示你把

By Race604