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

独立博客终于回来了

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

By Race604

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

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

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

Android

[第27期]Android周报

文章/教程 1. Android MVPR 架构模式 本文以 Google 的 IOSched 为例,分析了传统的 MVP 模式存在什么问题。IOSched 以前都是作为一个学习的典范来推荐,本文作者却对本项目的架构提出一些质疑和思考,后续的文章将会提出他得解决方案,这是非常好的极客精神。 2. Android 性能优化典范(三) 这是前段时间 Google 推出 Android 性能优化系列视频的第三季的文字总结,文章简洁清晰,干货很多。前两季的总结,也在作者的博客中能找到,感谢@胡凯me。 3. 逃离 adapter 的地狱-针对多个 View type 的组合实现方案 本文通过实例,讲述了你是怎么在不知不觉中陷入 Adapter 地狱的,如果你的 RecyclerView 要显示很多种类型的 Item,

By Race604

Android

[第26期]Android周报

文章/教程 1. Android Studio 使用 Gradle 打包 Jar 使用 AS 打包 Jar 并不是很方便,本文给出了一个使用 Gradle 自动打包 Jar 并混淆的解决方案。 2. 一个优秀的 Android 应用从建项目开始 本文介绍了开始一个新的 Android 项目可以遵循的一些基本规则,有一个好的开始,后面开发就会更顺利。 3. 探究 android:largeHeap 本文介绍了 Android 4.0 对 Application 引入属性 android:largeHeap 是怎么回事,有什么作用以及使用的注意事项。 4. Android 平台免 Root 无侵入 AOP 框架

By Race604

博客从 Ghost 迁移到 Hexo

这两天我的博客不能访问了,因为 Azure 服务器这个月到期了,服务器被彻底回收了。我立刻买了一个阿里云的服务器,安装好环境,配置好我钟爱的 Ghost 博客。因为之前的博客数据都备份的很好,很快恢复了全部博文。然后把我的域名修改一下解析,访问 www.race604.com,完美。正当我舒一口气的时候,网页突然变成了这样: WTF,这是什么鬼,竟然要!!备!!案!!,因为之前的服务器实在香港,所以一直不知道还有这么回事。我按照网上的流程,赶紧走备案流程,填写资料、上传身份证、打印核验单、签字、拍照片照相上传,提交。我能做的就是等了。 同时,我向群里的大神们求助,了解到,如果使用阿里云的服务器,使用 80 端口搭建网站,必需要备案,而且备案流程需要 20 天左右,今天接到阿里云客服的电话,也确认需要 18

By Race604

Android

[第25期]Android周报

文章/教程 1. 使用Kotlin开发Android应用系列 看起来用 Kotlin 来做 Android 开发的时机越来越成熟。这是一个系列译文,从入门开始介绍怎么使用 Kotlin 来开发 Android 应用。系列文章(I):简介、(III):扩展函数和默认值、(IV):自定义视图和Android扩展。 2. [译]使用 Android Support Annotations 优化你的代码 使用 Android 的注解是一个非常酷的功能,特别是设计 API 的时候,可以极大的提高你的代码的可读性和在写代码的阶段就保证代码的健壮性。 3. LocalBroadcastManager 的实现原理 LocalBroadcastManager 为什么更加高效?来看源代码就清楚了,原理原来这么简单和巧妙。 4. Android HandlerThread 完全解析 HandlerThread 可以提供一个 Looper,

By Race604

Android

BLE 广播数据解析

从上一篇 GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据。广播数据中带有设备相关的信息。本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析。 广播模式 BLE 中有两种角色 Central 和 Peripheral,也就是中心设备和外围设备。中心设备可以主动连接外围设备,外围设备发送广播或者被中心设备连接。外围通过广播被中心设备发现,广播中带有外围设备自身的相关信息。 广播包有两种:广播包(Advertising Data)和响应包(Scan Response),其中广播包是每个设备必须广播的,而响应包是可选的。 数据包的格式如下图所示(图片来自官方 Spec): 每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。 * 有效数据部分:包含若干个广播数据单元,称为 AD Structure。如图中所示,AD Structure 的组成是:

By Race604

Android

[第24期]Android周报

文章/教程 1. Gradle Tips 这是一个系列译文,包含(一)、(二)、(三)。文章清晰易懂,是非常好的 Gradle 入门教程。(by @hi大头鬼hi) 2. Material Design:扁而不平 关于 Material Design 的小品文,表面上讨论 Material Design 到底扁不扁,实际上是阐述它的设计哲学。 3. CoordinatorLayout 与滚动的处理 CoordinatorLayout 是 Design Support Library 中最重要与最难的部分,它支撑了很多 Material Design 效果的实现。正因为它功能强大,实现也非常巧妙。本文讲解了 CoordinatorLayout 的使用方法和工作原理。 4. Android UI

By Race604

Android

GATT Profile 简介

网上关于讲解 BLE 的内容比较少,看到这篇文章写的非常详细 Introduction to Bluetooth Low Energy,作为 BLE 的入门时介绍是非常合适的。本文主要翻译了一下这篇文章。 一、 引言 现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。 二、 GAP 详细介绍 GATT 之前,需要了解 GAP(Generic Access Profile),它在用来控制设备连接和广播。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。例如 Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。 1. 设备角色 GAP 给设备定义了若干角色,

By Race604

Android

[第23期]Android周报

文章/教程 1. Android 开发有哪些新技术出现? Android 社区新技术层出不穷,本文从开发工具到设计模式,再到 UI 设计总结了 Android 开发的新技术。 2. 如何高效学习 Android 动画? 动画是 APP 的点睛之笔,Android 提供很多动画 API,可以形成一个独立的动画系统。本文介绍了怎样去学习动画开发。 3. 关于 APK 瘦身值得分享的一些经验 本文介绍了 APK 是由什么组成的,从这里入手,分享了一些减小 APK 包大小的方法和经验。同时推荐我自己的一篇翻译摘要给 Apk 瘦身。 4. 避免 Android 中 Context 引起的内存泄露 Context 在 Android 中无处不在,处理不当就可能会引起内存泄露,

By Race604

Android

知乎回答-Android 开发有哪些新技术出现?

这里记录一下在知乎回答的《Android 开发有哪些新技术出现?》。知乎链接在这里。 原问题如下: Android 开发有哪些新技术出现?  可以从UI设计或者一些核心的算法之类的说起 这是我回答的原文: 第一次在知乎回答问题,感觉有些战战兢兢,在大神云集的地方,生怕有些东西说错,让大家笑话。 题主提的这个问题,相信很多开发者都有自己的话要说。Android 的发展确实太快了,每年的都有很多新东西出现,想要覆盖所有新东西感觉也不太可能,我这里主要说一下主要的 Android 的主要新技术发展,其实了解 Android 的发展趋势,可能对开发者更有帮助。 开发工具 1. Android Studio: Google 官方放弃 Eclipse 和 Android Studio 普及。AS 虽然不算新,但是对 Android Studio 这个软件的更新速度快的惊人,有大量的新功能发布。例如支持很多注解代码提示注解、Live code template、支持自动生成

By Race604

Android

[第22期]Android周报

文章/教程 1. Android APP 内存优化之图片优化 作者从实践经验中总结了一些优化 APP 内存的方法,特别是对大屏幕、多图片的应用这些方法都很有效。 2. Android Design Support Library 的代码实验 一篇非常详尽的 Android Design Support Library 的使用文章,有完整的工程,并且这个库中的各种坑也指出来了,你一定用的上。 3. MIUI 添加内存调试工具:查看进程中的 Bitmap 信息 Android 应用的内存消耗一直是工程师最头疼的事情,MIUI 系统提供了一个比较底层,诊断应用的 Bitmap 消耗内存的 工具,用这个工具可以查看特定进程中,当前 Bitmap 的使用情况。 4. Android 增强版百分比布局库 看到大家都很喜欢 Android 新发布的百分比布局,

By Race604

Android

Android GATT 连接过程源码分析

低功耗蓝牙(BLE)设备的通信基本协议是 GATT, 要操作 BLE 设备,第一步就是要连接设备,其实就是连接 BLE 设备上的 GATT service。 结合上一篇文章,我这里结合源码,分析一下 GATT 连接的流程,以及各个模块是怎么相互交互的。注意本文依据的是 Android 4.4 的源代码。 应用框架层 首先,一般应用层都是通过调用如下方法,来创建一个 GATT 连接的: mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 这里调用了方法 connectGatt(),我们来看一下源码,代码在 /frameworks/base/core/java/android/bluetooth/BluetoothDevice.java: public BluetoothGatt

By Race604

Android

[第21期]Android周报

文章/教程 1. ViewOverlay 与 animation 介绍 本文简单介绍了 Android 4.3 引入新类 ViewOverlay 的特性,ViewOverlay 就是一个在普通的 View 之上的一个视图层,是用来做动画的绝佳的地方。 2. 手动实现布局过渡效果(Layout transition) 这是一个系列文章,介绍了怎么一步一步手动实现一个 Layout transition,包括(一)、(二)、(三)、(四) 顺便推荐一下本文的原文出自 Styling Android,此博客以写 Android 系列教程而出名,内容易懂、循序渐进,而且介绍的 Android 技术都是非常前沿,值得关注。 3. Kotlin 在 Android 工程中的应用 [Kotlin]

By Race604