Android Filter 分析

简介

Filter 是 Android 提供的用于搜索或过滤数据的工具类,它在 android.widget 包中,从包名上看,和控件相关,适用于处理界面相关的搜索场景。

通常可与 SearchView 控件组合使用,可为用户提供便捷的列表项搜索功能。

用法

考虑在一个文本类型的列表视图上进行搜索,例如联系人列表,为了展示数据通常使用一个 ListView 或 RecyclerView 和实现它们对应的适配器,那么适配器很适合成为一个 Filterable 子类型,支持对其内部的字符串列表数据进行搜索。

阅读更多

支持触摸拖动的 TouchDelegate

需求

最近有一个小需求,就是在界面上有一个预览图片的区域,这个区域用户可以双击缩放图片、双指自由缩放图片、触摸图片进行移动,对图片的局部区域进行查看,像这样:

这个功能可以使用 github 中的开源库 PhotoView 实现,地址:https://github.com/Baseflow/PhotoView

同时另一个条件是当前这个图像预览区域较小,不像上图这样预览区域比较大,大概是 4 分之 1 左右,如果直接使用 PhotoView 设置图片,那么用户体验可能较差,因为图像展示区域较小,难以进行自由的图像移动预览操作,所以这个需求就是:扩大触摸区域,让用户在图像显示区域的外侧也可以自由的对图像进行移动预览操作。如下,白色区域是 PhotoView 的父控件的区域,用户触摸和双击这里时,可对图像进行预览操作:

阅读更多

Android 应用进程 ServiceManager 的实现

实现一个普通应用进程中的 ServiceManager,可自由注册和获取 Binder 服务。

文末给出开源仓库地址。

Binder 相关基础可参考:android-binder-设计分析

实名 Binder 与匿名 Binder

实名 Binder

在 Binder 通信模型中,存在一个 ServiceManager 的角色,它作为 Android 系统的服务总管,负责建立 Binder 名字和 Binder 实体的映射。

提示:ServiceManager 中的 Service 和 android.app.Service 组件不是同一个概念。

阅读更多

好用的 Android 日志工具

简介

分享一个 Android 日志工具(Java 层),几乎我的每个项目都会用到,自认为非常好用,这里描述一下它的设计和实现。

它有如下几个特点:

  1. 简单,仅由一个 100 余行的 Java 类实现,猴子都能看懂 ^_^;
  2. 额外可选日志内容,提供线程名信息和调用栈,提供当前日志打印所在类以及所在代码行数;
  3. 方便,包含栈信息,直接用鼠标即可点击到日志打印所在行;
  4. 安全,保证日志字符串完全被优化掉,而不是留在代码中,下面会分析;
  5. 灵活,提供二次封装。

开源仓库地址在文末给出。

阅读更多

Android JNI 指南

前言

编写此文档的用意:

作为 Android NDK 项目开发的参考手册。

对于 NDK 工程的搭建可参考 Android NDK 指南

JNI 简介

JNI(Java Native Interface,Java 原生接口),是 Java 和 C++ 组件用以互相通信的接口。

Android 平台下的 JNI 支持由 Android NDK 提供,它是一套能将 C 或 C++(原生代码)嵌入到 Android 应用中的工具。

为什么要使用 JNI 在 Android 平台下进行编程:

  1. 在平台之间移植应用;
  2. 重复使用现有库,或者提供自己的库供重复使用;
  3. 在某些情况下提供高性能,特别是像游戏这种计算密集型应用;
  4. 提供安全性保障,在二进制层面比字节码层面的逆向工作更加困难。
阅读更多

Android NDK 指南

前言

编写此文档的用意:

  1. 作为搭建基础 NDK 工程的教程;
  2. 作为入门 NDK 工程的参考手册。

NDK 工程构建

可采用三种方式进行 NDK 工程的构建:

  1. 基于 Make 的 ndk-build,这是传统的 ndk-build 构建方式,使用 Makefile 方式进行构建,简洁高效;
  2. CMake 是新型的构建方式,CMake 具有跨平台的特性,通过 CMake 生成 Makefile 后再进行构建,CMake 的配置文件可读性更高;
  3. 其他编译系统,通过引入其他编译系统可对编译过程进行定制,例如引入 obfuscator-llvm 对源码进行混淆和压缩,增强源代码安全性。

下面是每种构建方式的基础示例,使用 Android Studio 4.0 和 NDK 21 进行如下构建。

阅读更多

Android ClassLoader 简析

ClassLoader 加载机制

ClassLoader 是一个抽象类,它为 Java 虚拟机上运行的进程提供类加载的操作,它定义了类加载器的标准接口,具体加载类的逻辑,以及加载类的路径由其具体子类实现。

ClassLoader 对外提供一个 loadClass 方法,使用时调用此方法并传入符合 java 标准的全类名参数,将会返回一个 Class<?> 对象,通过查看 loadClass 方法的实现可以了解到类加载器的加载机制。

阅读更多

Android View 事件分发机制

触摸事件处理框架

Android 的 View 和 ViewGroup 采用了 Composite(组合) 设计模式,View 的组合具有高度动态性,在这种情况下,由于触摸事件是从底层驱动传递至上层 View 对象,如果按照普通对象间传递信息的方式,将会很复杂,很难处理,这里 Android 采用了 Chain of Responsibility(责任链) 设计模式,触摸事件流将通过视图树,使每个 View 对象都有机会处理事件,一旦某个 View 选择接收事件流,那么整个事件将交给它处理,如果 View 选择不处理,那么事件流会继续传递,直到找到最后的处理者,在处理触摸事件时有几个重要的方法,在弄懂 Android 事件分发机制之前,需要先了解这几个方法的作用及关系。

阅读更多

Android 坐标系和 View 滑动方法

Android 二维坐标系

和 Java 图形化界面开发类似,Android 中也有一种坐标系,这里说说二维平面的坐标系,在 Android 中,坐标系起始点以左上角为原点,竖直向下是 y 轴的方向,横向向右是 x 轴延伸方向,对于 Android 中的 View 来说,它本身所具有的一些位置相关的参数会根据这个坐标系来确定数值和正负,掌握这些有助于理解 View 在布局层次中所处位置的意义。

下面用一个典型例子来说明 Android 中的坐标系:

阅读更多