Android

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

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

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

Android

Drawable 着色的后向兼容方案

看到 Android Weekly 最新一期有一篇文章:Tinting drawables,使用 ColorFilter 手动打造了一个 TintBitmapDrawable,之前也看到有些文章使用这种方式来实现 Drawable 着色或者实现类似的功能。但是,这种方案并不完善,本文将介绍一个完美的后向兼容方案。 解决方案 其实在 Android Support V4 的包中提供了 DrawableCompat 类,我们很容易写出如下的辅助方法来实现 Drawable 的着色,如下: public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) { final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); DrawableCompat.setTintList(wrappedDrawable, colors); return wrappedDrawable; } 使用例子: EditT

By Race604

Android

[第28期]Android周报

文章/教程 1. Android NestedScrolling 实战 Android 5.0 和 Support V4 包中开始提供一套 NestedScrolling API 来支持嵌入的滑动。有了 NestedScrolling 可以实现很多复杂的滑动效果。 2. [译]深入讲解Android中Activity launchMode 这是我见过的最清晰的 Activity 的启动模式讲解,丰富的图片展示,把各种情况展示的非常清晰。 3. Android OkHttp 完全解析 本文介绍了 OkHttp 的基本使用,并且通过简单的封装,实现一个请求管理类,简化使用。 4. Glide 一个专注于平滑滚动的图片加载和缓存库 本文介绍了使用 Glide 的一些技巧,在使用过程中可能遇到的问题及其解决方法。同时推荐看这篇文章:Google推荐的图片加载库Glide介绍。 5. 【译】Don&

By Race604

Android

Android NestedScrolling 实战

从 Android 5.0 Lollipop 开始提供一套 API 来支持嵌入的滑动效果。同样在最新的 Support V4 包中也提供了前向的兼容。有了嵌入滑动机制,就能实现很多很复杂的滑动效果。在 Android Design Support 库中非常重要的 CoordinatorLayout 组件就是使用了这套机制,实现了 Toolbar 的收起和展开功能,如下图所示: NestedScrolling 提供了一套父 View 和子 View 滑动交互机制。要完成这样的交互,父 View 需要实现 NestedScrollingParent 接口,而子 View 需要实现 NestedScrollingChild 接口。 实现 NestedScrollingChild 首先来说 NestedScrollingChild。如果你有一个可以滑动的 View,需要被用来作为嵌入滑动的子 View,

By Race604

Android

Android 6.0 中新的新技术

最近 Google 正式发布了 Android M,并命名为“棉花糖”(Marshmallow),对于开发者来说,有哪些新的技术和变化呢?本文尝试总结一下 Android 6.0(API 23)给开发者带来新的技术和改变。 权限管理 权限管理是 Android M 最大的改变,权限管理更加精细,并且由以前的安装时静态授权,改为现在的运行时动态授权。大家对 Android 的权限吐槽已久,Android 应该能极大的改善这方面的问题。主要改变有: * 系统设置中可以对 APP 各个权限单独控制 * 权限根据内容进行分组了 * 普通权限还是在安装时授权 * 其他权限在运行时系统弹窗授权,并且要解析使用这个权限的目的 对于开发者来说,需要小心处理权限相关的问题。在使用某个功能的时候,需要总是判断是否有改权限,并且通过合适的方式请求用户授权。关于 Android M 权限的处理,可以参考官方文档。 另外,这篇文章结合图文和代码讲述了

By Race604