Latest

Android

[第10期]Android周报

文章/教程 1. Android模块化编程之引用本地的aar 使用aar对Android库进行打包,实现Android模块化编程。本文介绍arr基本概念,和在项目中引用本地aar的方法。 2. Android编程下Touch事件的分发和消费机制 本文结合实例分析和解释了Android中的Touch事件分发机制。 3. 深入浅出RxJava(二:操作符) 这是深入浅出RxJava系列的第二篇,介绍了RxJava中的操作符。 4. 这些高效的Android注解,你有使用过么 本文介绍了Android support库中的几个非常实用注解,让你的写代码更方便,更有可读性。 5. Android最佳性能实践(三)——高性能编码优化 系列文章的第三篇,本文介绍一些性能编码优化的小技巧。 源代码/库 1. SwipeBack 使用滑动手势返回,可以支持上、下、左、右四个方向。 2. LoganSquare 极速的JSON解析和序列话库,比GSON和Jakeson快至少400%。并且支持流式API。 3. CropIma

By Race604

Android

[第9期]Android周报

羊年第一期,新春快乐,天天向上。 文章/教程 1. 深入浅出RxJava(一:基础篇) RxJava是一种对JVM的扩展,给Java带来函数响应式编程(Functional Reactive Programming)能力。一种新的编程模式袭来,赶紧学起来。 2. 帮你全面彻底搞定MATERIAL DESIGN的学习笔记 Material Design已经被讨论了无数次了,本文对MD中方方面面做了一个简洁摘要,让你快速对MD有一个大体概念。 3. Android开发贴士集合 一些非常有用但是可能被人忽略的Android开发小贴士集合,一共有四篇(1,2,3,4)。 4. Android Drawable那些不为人知的高效用法 Drawable在我们平时的开发中,基本都会用到。本文从自定义Drawable,自定义Drawable状态,利用Drawable提升UI性能三个方面展开。 5. 公共技术点之面向对象六大原则 面向对象编程六大原则可能能够脱口而出,但是真正实践起来可能就不那么容易,本文结合实例讨论面向对象设计原则。内功心法,需要

By Race604

Android

[第8期]Android周报

文章/教程 1. 开源项目Philm的MVP架构分析 从项目Philm分析实现MVP架构,是一个很好的学习MVP的文章。想要实践MVP架构的朋友不要错过。 2. Java注解处理器 这一篇译文,这是一篇详尽的解释和实现Java注解处理器的文章,文章很长,耐心读完,一定会让你有所收获。 3. Android在横竖屏切换时到底发生了什么? 这是Square的一篇技术博客的译文,我虽然觉得译文的标题有些不妥(或者可以叫屏幕旋转的时候主线程消息处理),但是文章内容还是很值得一看的。 4. Android最佳性能实践(二)——分析内存的使用情况 继上期周报推荐的第一篇之后,这篇文章从分析内存使用的角度入手,叫你在实际项目中,Debug代码内存问题。 5. NineOldAnimations 设计解析 NineOldAndroids是一款支持在低版本( api 11以下 )使用Android属性动画以及3D旋转动画的框架,提供了类似Android 3.0以上的动画API。本文就解析它是怎么实现的。 6. 视频:Android自定义任意层级树形控

By Race604

Android

Java注解处理器

Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的。一直想详细了解一下其中的原理。很有幸阅读到一篇详细解释编写注解处理器的文章。本文的原文是ANNOTATION PROCESSING 101,作者是Hannes Dorfmann。这是一篇好文,忍不住翻译学习一下。以下是翻译。(注:本文的翻译已经获得了作者 Hannes 的授权。) 在这篇文章中,我将阐述怎样写一个注解处理器(Annotation Processor)。在这篇教程中,首先,我将向您解释什么是注解器,你可以利用这个强大的工具做什么以及不能做什么;然后,我将一步一步实现一个简单的注解器。 一些基本概念 在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。 注解处理器(Annotation Processor)是javac的一个工具,它用来在编译时扫描和处理注解(Annotation)。你可以对自定义注解,并注册相应的注解处理器。到这里

By Race604

Android

[第7期]Android周报

文章/教程 1. Android App 性能优化实践 App性能优化开始被重视起来。最近连续出了一些写性能优化的文章。本文记录了Android App优化需要用到的工具和以及在实践中的Tips。这里还有UC的工程师分享视频。 2. 深入解析Android的自定义布局 这篇文章是前Firefox Android工程师(现在跳槽去Facebook了) Lucas Rocha所写,文中对Android中常用的四种自定义布局方案进行了很好地分析,并结合这四种Android自定义布局方案所写的示例项目讲解了它们各自的优劣以及四种方案之间的比较。 3. 与Sevice实现双向通信 这是一个系列文章,包括一、二、三。文章非常详尽的介绍和实现了一个简单的Service双向通信的例子。 4. Android最佳性能实践(一)——合理管理内存 本文从合理使用内存的角度,提供了一些编程过程中的一些建议,来优化Android性能。 5. Android 打造编译时注解解析框架 本文讲解了一些关于Java的注解的基本概念,并且介绍怎么实现一个自定义的注解。

By Race604

Android

与Service实现双向通信(三)

1. 与Service实现双向通信(一) 2. 与Service实现双向通信(二) 3. 与Service实现双向通信(三) 这是系列文章《与Service实现双向通信》的第三篇,也是完结篇。通过前两篇介绍,我们基本已经实现了Client到Service的调用了。但是Service怎么反过来调用到我们的Client端呢? 我们接着上篇的例子,我们希望能够实现,当有用户加入(join())或者离开(leave())的时候,能够通知客户端。 实现方法是,客户端注册一个回调到Service中,当Service有用户加入或者离开的时候,就调用此回调。因为普通的interface对象不能通过AIDL注册到Service中,我们需要定义一个AIDL接口,如下: // IParticipateCallback.aidl package com.race604.servicelib; interface IParticipateCallback { // 用户加入或者离开的回调 void onParticipate(String name, boolean join

By Race604

Android

与Service实现双向通信(二)

1. 与Service实现双向通信(一) 2. 与Service实现双向通信(二) 3. 与Service实现双向通信(三) 这是系列文章《与Service实现双向通信》的第二篇。有了上一篇文章作为基础,本文实现一个稍微复杂一点的场景: Service端实现一个控制中心(例如一个多人游戏),客户端可以随时加入,或者退出,每个客户端都可以获取当前参与进来的成员列表。 根据需求,在上一篇文章的代码的基础上,我们可以很容易申明如下接口: // IRemoteService.aidl package com.race604.servicelib; interface IRemoteService { ... void join(String userName); void leave(String userName); List<String> getParticipators(); } Service的实现也很简单,大致如下: // RemoteService.java package com.race604.

By Race604

Android

与Service实现双向通信(一)

经常有这样的应用场景,我们需要Client端调用Service完成一些事情,Service也可以通过回调通知客户端。 这是我写的第一个系列文章: 1. 与Service实现双向通信(一) 2. 与Service实现双向通信(二) 3. 与Service实现双向通信(三) 这是系列文章的第一篇,本文主要实现一个基本的远程AIDL调用。 首先,大概来总结一下与Service的通信方式有很多种: 1. 通过BroadCastReceiver:这种方式是最简单的,只能用来交换简单的数据; 2. 通过Messager:这种方式是通过一个传递一个Messager给对方,通过这个它来发送Message对象。这种方式只能单向传递数据。可以是Service到Activity,也可以是从Activity发送数据给Service。一个Messeger不能同时双向发送; 3. 通过Binder来实现远程调用(IPC):这种方式是Android的最大特色之一,让你调用远程Service的接口,就像调用本地对象一样,实现非常灵活,写起来也相对复杂。 本文最重点谈一下怎么使用AIDL实现Se

By Race604

Android

[第6期]Android周报

文章/教程 1. 根据Smali文件还原java代码 我们Apk反编译得到的代码,jar的话可能很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思。因此,我们有必要熟悉smali语法。 2. Gradle自定义你的BuildConfig Gradle自定义你的BuildConfig,添加自定义字段,自动化配置你的开发和正式包。 3. Android任务和返回栈完全解析,细数那些你所不知道的细节 Android Activity的启动模式被谈过很多次,认真看官方文档还是理解最精确的。 4. 视频:React Native介绍 Facebook发布React Native框架,可以使用JS来写Native的iOS和Android应用,不是长的像,是真的Native app。持续关注一下。 5. Android NDK开发Crash错误定位 本文从实例解析使用NDK调试工具定位NDK错误,简单易懂。 源代码/库 1. SmartAppUpdates Android应用增量更新库,自己实现增量更

By Race604

Android

[第5期]Android周报

文章/教程 1. Android Studio系列教程六--Gradle多渠道打包 非常实用的Gradle打包教程,多渠道打包一个自动完成。 2. Android性能优化典范 Google前不久推出一系列Android性能优化典范的专题视频。典范也不是白叫的,本文把视频内容整理成教程,非常清楚详细,强烈推荐看。 3. Android L 的 JobScheduler API 是怎么让设备省电的 JobScheduler是一个Android L新引入的工具,用来调度一些后台任务,主要做省电考虑,JobSchedulerCompat是一个兼容到API 10的库。 4. Google Android官方培训课程中文版 看名字标题就知道,值得细读。 5. Android的Parcelable自动生成 Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐的。本文提到的几个工具可以大大提高你的工作效率。 源代码/库 1. Glide 又一个Android图片加载库,专门针对流畅滑动界面做的优化,使

By Race604

Android

[第4期]Android周报

文章/教程 1. Android Studio系列教程五--Gradle命令详解与导入第三方包 几个简单的Gradle命令,帮你实现在命令行下编译打包Apk。 2. Android Studio中NDK开发 切换到Android Studio,做NDK开发也能轻松搞定。 3. Android中SQLite数据库插入或替换 一条SQL语句搞定数据库插入或者更新。 4. SnappyDB—Android上的NoSQL数据库 Android上做数据缓存的绝佳选择。 5. Android Studio Tips -- 布局预览 写布局xml的时候,使用Tools来预览各种情况下的布局效果。 源代码/库 1. SecretTextView 实现类似Secret app的中,文字按照不同的速度隐去或显示,看起来非常魔幻。 2. MaterialNavigationDrawer 又是一个Material Design的库,实现类似最新版Google Play的侧滑抽屉效果。 3. Reachability 让你的

By Race604

Android

SnappyDB—Android上的NoSQL数据库

还是从需求出发。在开发App的时候,经常需要缓存一些数据,不至于每次打开App都是空的,需要从网络下载数据。例如新闻客户端,需要缓存上次打开的新闻。 一般的做是使用SQLite数据库来保存数据,或者把数据序列化写到本地文件中。这两中方法,我在之前的项目中都用过。我先来说一下这两种方法的缺点: * 使用SQLite数据库保存: 对于保存缓存数据来说,这样做未免太重量级了,存取数据都比较麻烦。当然,你还要知道SQL语法。小心设计数据库结构。对于相对复杂的数据,你还要设计多张表。还需要小心维护数据库的升级。 * 使用文件缓存: 写文件保存,需要你保存的数据都实现Serializable接口,当然,这不是什么大问题。你要维护你的文件内容结构。如果数据比较多,你可能要维护多个文件的读写。性能也是比较堪忧。 说了上面那些方法的缺点,自然是为了请出本文的主角——SnappyDB。 SnappyDB是一个键-值数据库,是非常流行的NoSQL数据库。可以保存任何基本类型和序列化(Serializable)安全的数据及其数组。 首先来看一下基本用法,如下: DB snappydb = DB

By Race604

Web

Ghost评论系统换成多说

之前在Ghost添加评论这篇文章中已经提到,把给博客系统加上了第三方评论服务DISQUS。DISQUS在各方面都很不错,要替换掉还是有点不舍。只是因为它有点“水土不服”,要评论还需要注册一个帐号。 今天发现一个国内版本的DISQUS———多说,支持国内各种社交帐号登陆评论。集成方法也和DISQUS类似。基本步骤就是:注册帐号,添加代码。但是多说有点不一样,需要手动天蝎博客id和title。解决方法是参考这里Ghost添加多说评论 注册成功后,在多说工具页面,把多说通用代码添加到content/themes/casper/post.hbs中,并且把代码: <!-- 多说评论框 start --> <div class="ds-thread" data-thread-key="请将此处替换成文章在你的站点中的ID" data-title="请替换成文章的标题" data-url="请替换成文章的网址">

By Race604

Android

锁屏上显示Activity

在Android中,有些比较强的提醒,需要用户紧急处理的内容。需要唤醒屏幕,甚至在锁定屏幕的情况下,也要显示出来。例如,来电界面和闹钟提醒界面。这是怎样实现的呢? 其实,实现起来非常简单。只要给Activity的Window添加如下属性即可: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); ... } 注意这里的FLAG_SHOW_WHEN_LOCKED和FLAG_TURN_SCREEN_ON,从名字上就能看出其作用。FLAG_TURN_SCREEN_ON使Activity启动的时候能够点亮屏幕。FLAG_SHOW_WHEN_

By Race604

Android

Android中SQLite数据库插入或替换

SQLite是Android内置的轻量级数据库。我们在操作数据库的时候,经常有这样的需求: 如果没有这个Primery Key的数据,就插入这条数据;如果已经存在了,就更新这条数据。 之前我的做法是先SELECT一下,看是否有数据?如果有的话,就UPDATE这条数据,如果没有的话,就INSERT一条数据。 最近发现更好的解决方法,一条SQL语句就能解决。假设你的表包含三列,分别是id、name、role,其中id是主键。 INSERT OR REPLACE INTO Employee (id, name, role) VALUES (1, 'John Foo', 'CEO'); 其中关键是INSERT OR REPLACE。如果数据库表中已经包含了id=1的情况,就会直接替换掉。 要达到同样的目的,可以在创建表的Schema的时候,使用ON CONFLICT REPLACE来实现。如下:

By Race604

Android

Android Studio中NDK开发

更新(2015.07.24):本文说的方法是针对Android Studio 1.3 之前的版本,从 AS 1.3 开始,官方支持了 NDK 的开发,可以参考这里。 之前有人问到怎么使用Android Studio进行NDK开发,经过网上搜索,自己也尝试了一下,用Android Studio进行NDK开发比Eclipse更加灵活方便。 以下是翻译自NDK With Android Studio这篇文章。 在ADT中进行NDK开发非常简单,在Android Studio进行NDK开发也同样的容易。NDK开发主要有两中情况:一种是使用已经编译好的.so动态库;一种是使用c/c++源代码开发。下面分别介绍。 使用预编译好的.so动态库 你可以先用ndk-build工具先编译好.so,然后在Android Studio中引用。 这种情况比较件简单,只要把的.so文件放到相应的目录即可。如下所示: * [module_name]

By Race604