Android

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

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

Android

[第3期]Android周报

2015年第一期,新年快乐! 文章/教程 1. Android Service完全解析,关于服务你所需知道的一切 这篇文章比较老了,分为上下两篇文章,很清晰的讲解了Android Service的各方面的问题,值得看一下。 2. Android NDK开发(五)——C代码回调Java代码 记得以前面试的时候被问到JNI中Native代码怎么回调Java代码,本文有比较详尽的解答。 3. [Material Design] 打造简单朴实的CheckBox 从头打造一个漂亮CheckBox控件。 4. Android模拟产生事件 上周报,没理由。 源代码/库 1. TwoWayView RecyclerView的简化封装,能够横向/竖向的List/Grid/瀑布流等布局,还支持跟ListView类似的单选/多选模式。而且接口上也非常接近传统的ListView,还有什么理由不用RecyclerView来武装你的App? 2. awesome-android-ui Android UI库的大集合,按照类别归类的,在你打算自

By Race604

Android

Android模拟产生事件

我们有时候需要使用程序产生一些输入事件。例如一些“丧心病狂”的App,让你发疯的狂点屏幕来抽奖,程序来帮你,包你中奖。当然,本文并不是为了来作弊,而是开发过程中的一些实用工具。 给系统模拟注入输入事件有如下几种方式: 1. 使用shell命令 Android中自带一个input工具,使用方法如下: adb shell #进入系统 输入如下命令: input keyevent KEYCODE_BACK 或者 input keyevent 3 #模拟按返回键 input keyevent KEYCODE_HOME #模拟按Home键 上面的命令就给Android系统输入了相应的按键,使用方法是input keyevent <按键名或者按键值>。按键名或者值可以从官方文档查询,只要是以KEYCODE_开头的都可以。 如果系统的焦点在输入框内,还可以直接输入文本: input text hello 直接在输入框内输入hello。输入的文本不能带空格,也不能是中文,

By Race604

Android

[第2期]Android周报

文章/教程 1. Android Studio系列教程四--Gradle基础 Android Studio 1.0已经发布了,相信许多人已经用上了。Android Studio和ADT的最大却别就是使用Gradle来配置和管理项目的编译。本文介绍了Gradle的基础,会解决一些刚切换到Android Studio的迷茫感。 2. Android中使用MVP模式简介 随着Android应用的越来越复杂,项目越来越大,开发者门觉得传统的Android开发模式已经抗不住了。经常在各种地方看到有人提到MVP模式,MVP模式是解决这些问题的法宝么? 3. Android 属性动画 源码解析 深入了解其内部实现 看源码需要技巧和耐心,有大牛带着看源码,思路瞬间开朗。本篇博客将分析属性动画的实现源码,带你深入的了解Android属性动画的内部实现机制。 4. Android使用adb抓完整Log 会察看Log,是解决bug成功的一半。本文简要介绍了Android系统的各种Log的方法。 源代码/库 1. BottomSheet Materia

By Race604

Android

Android中使用MVP模式简介

经常在各种地方看到有人提到MVP,在Android的开发中MVP模式越来越流行,我这里也学习和总结一下MVP模式。 本文参考自:MVP for Android, The Clean Architecture以及Resources for Learning Dagger for Android。 软件架构的依赖规则: 软件是分层的,高层是基础业务逻辑和策略,低层是实现机制和展现形式。代码和数据依赖只能是低层代码依赖高层,而不能反过来。 什么是MVP? MVP是Model, View和Presenter的简称。是非常有名的MVC模式的演化版。MVP模式把显示逻辑和从业务逻辑层中分离出来,理想状况下,MVP模式中,在替换不同的视图(View)的情况下,可以实现完全相同的业务逻辑。 Presenter代替了MVC中Controller,它比Controller担当更多的任务,也更加复杂。Presenter处理事件,执行相应的逻辑,这些逻辑映射到Model的Command以操作Model。那些处理UI如何工作的代码基本上都位于Presenter。Presenter如同一个乐队的指挥家

By Race604

Android

[第1期]Android周报

文章/教程 1. 代码规范和Android项目中的一些可用工具 本文介绍了关于代码规范的相关问题,和在Android项目中如何利用一些工具进行规范和检查。介绍了什么是代码规范及其好处,介绍了工具Checkstyle、Findbugs、PMD的使用方法。 2. Dalvik虚拟机垃圾收集(GC)过程分析 作者从Android源代码层分析和讲解Android的GC过程。文章很长,做好心里准备。 3. Android BitmapShader实战 实现圆形、圆角图片 本篇博客详细讲解了使用BitmapShader实现圆角或者圆形绘制自定义的ImageView。 4. Android 优秀开源项目实现原理解析 我们不重复造轮子不表示我们不需要知道轮子该怎么造及如何更好的造!解析最流行的开源库的原理。 源代码/库 1. Android testing samples Google官方的Android自动化测试例子,有什么理由不看? 2. SuperRecyclerView 对RecyclerView的封装,内建功能:加载Prog

By Race604

Android

Android中的Context详解

注:本文翻译自Context, What Context?,原文链接在这里,作者是Dave Smith。ps:这个网站的是设计风格非常清新。 Context可能是Android应用中最常用的元素,而它也可能是最容易误用的。 Context对象是如此常见和传递使用,它可能会很容易产生并不是你预期的情形。加载资源、启动一个新的Activity、获取系统服务、获取内部文件路径以及创建view(其实还远不止这些)统统都需要Context对象来完成。我(原文作者)想做的只是给大家提供一些Context是如何工作的见解,以及让大家在应用中更有效的使用Context的技巧。 Context的类型 并不是所有的context实例都是等价的。根据Android应用的组件不同,你访问的context推向有些细微的差别。 * Application - 是一个运行在你的应用进程中的单例。在Activity或者Service中,它可以通过getApplication()函数获得,或者人和继承于context的对象中,通过getApplicationContext()方法获得。不管你是通过何种方法在

By Race604

Android

无设计开发漂亮App

作为一个纯技术码农,不会设计,也不会PS。开发App只能利用系统控件,界面看起来各种土气。这篇文章说说怎么在没有设计师帮助的情况下开发漂亮App。 Material design Google 在设计上第一次发布最全面的设计指南。可以看成是 UI 上的设计模式,是一个UI框架。Material design 把框架搭建好了,往里面填内容可以了。也可以看这个中文同步翻译版。现在基本上推崇的是扁平化,街面上表现的基本上纯色块,不需要借助PS软件,代码就可以搞定了。 另外,这里有个 Material design 调色板,可以选定你的App的主色调,然后自动生成一系列颜色的颜色值。 Material design icon Google想的更周到,怕你不会画icon,提供了全套的官方 Material design 风格的 icon,基本上你需要的常用icon都能在这里找到。提供 Android 版本 icon(hdpi, mdpi, xhdpi, xxhdpi, xxxhdpi)

By Race604