Default image

lizhaotailang

Markdown Cheatsheet

Markdown is a way to style text on the web. You control the display of the document; formatting words as bold or italic, adding images, and creating lists are just a few of the things we can do with Markdown.…

DeepLinkDispatch 的用法

什么是DeepLink深度链接? 先看图: 一个在Telegram中的dribbble链接, 点击后直接跳转到我的 Mango中, 是不是很神奇? 为什么要使用DeepLink? 一句话总结便是提升用户体验: 原生App在功能和体验上肯定是要强于网页的. DeepLinkDispatch DeepLinkDispatch提供了一种声明式的, 基于注解的API, 用于定义应用深度链接. 我们可以注册一个Activity, 并用@DeepLink和一个URI注解,然后她就可以处理特定的深度链接了.没错,就是这么简单. DeepLinkDispatch会对URI进行转换,并将深度链接和URI中特定的参数一起分发给合适的Activity. 举个🌰 下面,我们注册一个ShotActivity,并从像 我们使用@DeepLink注解并且标注出将会有一个参数被标识为id. 多个深度链接 有时候我们可能需要在一个Activity中处理多种链接: 方法注解 我们还可以将@DeepLink注解用于任何public static方法(在Kotlin中即companion object中的方法). DeepLinkDispatch会调用这个方法来创建Intent 如果我们需要Intent的extras, 可以直接在方法中添加一个Bundle类型的参数,例如: 如果我们需要定制Activity的返回栈, 可以返回一个TaskStackBuilder而不是一个Intent. DeepLinkDispatch会调用被注解的方法,从TaskStackBuilder的最后一个Intent创建Intent, 当从已经注册的deep link启动Activity时使用. 查询参数 查询参数被自动的转换和传递,并且像其他参数一样是可获取的. 例如, 我们可以获取URI 传递过来的查询参数: 回调…

简单高效的实现 Android App 全局字体替换

Android O 推出了一项新的功能「Fonts in XML」,借助这项功能,我们能够像使用其他资源文件一样使用字体,比较方便地实现App全局字体的替换。 为了能够在API 14或者以上的设备上使用Fonts in XML特性,我们需要使用到Support Library 26。更多的内容可以参考「使用Support Library」小节。 在Android Studio中按照如下步骤将字体作为资源文件添加至工程: 右键单击项目的 app / res 文件夹,然后选择 New > Android resource directory。 打开下拉菜单并选择 font,输入 font 作为File name,点击OK。 注意名称字体资源文件夹的名称必须为font 将字体文件拖放到新的 res / font 文件夹中。Android O支持 .otf(OpenType) 和 .ttf(TrueType) 两种格式的字体文件。…

Android APK 瘦身实践

在开始对APK进行正式的减肥之前,我们先来了解一下APK包的构成,这样才好对症下药嘛。知己知彼方能百战不殆。 APK文件内容速揽 我们可以通过 unzip <apkname>.apk 命令实现对apk的解压(你也可以直接将<apkname>.apk更名为<apkname>.zip后直接通过解压软件解压)。解压后,我们就会得到一个文件夹了,里面包含了: 各个文件和目录的作用是什么呢? 文件/目录 作用 AndroidManifest.xml 清单文件,列出了应用的名称,版本,权限等信息。 assets 配置文件,放置一些本地资源,例如本地html,可以通过使用AssetManager检索。 classes.dex, classes2.dex 编译后的字节码文件,能够被Dalvik/ART理解。 lib 存放特定平台使用的编译后的.so文件,每一个子文件夹对应一个特定的平台,例如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, and mips. META-NIF 包含 CERT.RSA, CERT.SF, MANIFEST.MF, 存放的签名信息,用于保证系统的安全性和APK文件的完整性。 res 存放没有被编译到 resources.arsc文件中的资源文件。 resouces.arsc 编译后的二进制资源文件。存放 res/values/ 目录下的所有XML内容。打包工具对XML内容进行提取,编译为二进制,并进行分类,其中,XML内容包含了不同语言的strings和styles,同时还包含没有被直接打包至 resources.arsc 文件的其他文件的路径,例如布局文件和图片文件。 OK,既然我们已经了解了APK的各个组成部分,那么我们就可以针对下面的三个组成部分,采取逐个击破的方式,达到缩减APK体积的目的:…

Android 实现条形码与二维码扫描

Android实现条形码与二维码扫描 在本次教程中,我们将使用ZXing库让我们的app实现条形码和二维码的扫描。 为什么选择ZXing 要实现条形码和二维码扫描功能,常用的有下面几种方法: 使用Google Play Service和Mobile Vision APIs。 使用barcodescanner库。 使用ZXing库。 我们来仔细分析以上三种方法各自的优缺点。 第一种,使用Google Play Service和Mobile Vision APIs。不合适,因为不是所有的用户设备都有安装Google Play Service,特别是在中国。 第二种,使用barcodescanner。也不合适,尽管barcodescanner的导入非常简单,识别也很快,但是UI的调整比较困难。特别是当UI非常复杂时,你就需要拉取整个项目的源码然后自己进行定制。 现在就只剩下ZXing了。ZXing库由谷歌出品,所以在短期内应该不会停止维护。很多应用,报错barcodescanner,都是基于ZXingk开发的。使用ZXing我们不用担心用户没有安装Google Play Service,而聚焦于开发和处理结果本身。 ZXing是什么 Zxing是Google提供的关于条码(一维码、二维码)的解析工具,提供了二维码的生成与解析的方法。 设置项目 添加依赖 在你的build.gradle文件(application级别)中,添加ZXing core的库。 添加必要的权限 在你的AndroidManifest.xml文件中,添加下面的代码: 导入必要的类和资源文件 将整个包复制到你的项目中。 注意:上面的包中的代码我做了简化,如果你需要ZXing示例项目此部分的完整的代码,请访问这里,并下载相应的代码。 代码文件导入完成后,我们还需要导入下面的资源文件: res/layout/activity_scan – CaptureActivity的布局文件. res –…

使用 ViewPager 实现 Material Design 风格炫酷引导页

当我们第一次打开一个App,首先映入眼帘的就是引导页了。 引导页向我们展示了一些可以滑动的页面,并在页面中以图片方式展示了这个App的一些亮点。要实现这个效果,网上更多的是通过引入第三方库的形式,但是,这哪里有我们自己动手撸一个来的痛快呢?所以,今天我将手 摸 把手的带大家实现一个符合Material Design标准的炫酷引导页。 效果预览 我们首先来看看Google Docs是实现的效果: 下面是我们将要实现的效果: 设计规范 在Material Design官方文档中,关于引导页的部分是这样说明的: Onboarding is a virtual unboxing experience that helps users get started with an app’s UI. It should be brief and enhance the use of the app. 简单来说,引导应该是一个简短的过程,能够帮助用户理解App的使用。 那么,我们应该什么时候使用引导呢?按照规范,当我们的应用添加了新的特色功能或者有重大改变时,应该使用引导页面。对于那些用户本来就期待的,很普通的功能,就不要滥用引导页了。…

Realm 在 Android 上的应用

什么是Realm? 在Android平台上,有很多基于SQLite的ORM框架,例如GreenDAO, OrmLite, SugarORM, LitePal等等,对于写习惯了SQL语句的小伙伴们来说,看到SQLite这样的数据库肯定是倍感亲切了,有了这些框架更是如虎添翼。 但是,在我们日常的开发中,数据量并不会特别的大,表的结构也不会特别复杂,用SQL语句有种大(过)材(于)小(繁)用(琐)的感觉,我们需要做的事情可能仅仅是把用户生成的数据对象快速的缓存起来。 这个时候NoSQL就派上了用场,以Mongodb,Redis为代表的NoSQL都引入了一些相对现代化的方式存储数据,比如支持Json,Document的概念,流式api,数据变更通知等等,极大程度的降低了我们学习的成本提高了我们的开发效率。而Realm作为一款移动端的NoSQL框架,官方定位就是替代SQLite等关系型数据库。 Realm是一个由Y Combinator孵化的创业团队开源出来的MVCC(多版本并发控制)的数据库,支持运行在手机,平板和可穿戴设备等嵌入式设备上。 Realm的优点 简单易用 速度快 跨平台 高级功能 可视化 开源 简单易用 上面我们已经说过,Realm并不是基于SQLite上的ORM,它有自己的数据库引擎,使用也非常简单。我们先来看看一段简单的代码。 速度快 我们直接看Realm官方的对比测试数据吧。 每秒能在200K数据记录中进行查询后count的次数: Realm能够达到30.9次,而SQLite只能达到13.6次,Core Data只能达到可怜的一次。 在200K条数据记录进行一次遍历查询,数据和前面的count相似: Realm能够达到每秒遍历200K数据记录31次,SQLite只能达到14次,而Core Data只有可怜的2次。 在一次事物中每秒插入数据量的对比,SQLite可以达到178K条记录,性能最好,Realm可以达到94K,而Core Data再次垫底,只有18K。 我自己也进行一次简单的测试,以JSON格式插入641条记录(好吧,我知道数据量比较小,仅仅只是一个参考,具体的数据可以参考这里)。 207毫秒(Android 7.1.1, Realm 3.0)。 跨平台 Realm目前支持Objective-C(iOS), Swift(iOS), Java(Android), JavaScript, Xamarin等平台。 现在很多应用都需要兼顾iOS和Android两个平台,使用Realm可以使用Realm提供的API,在数据持久化层实现两个平台的无差异化移植,无需对内部数据的架构进行改动。…

如何用一周时间开发一款 Android APP 并在 Google Play 上线

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 目标:实现纸飞机App – 采用MVP架构,集合了知乎日报、果壳精选和豆瓣一刻的综合性阅读客户端。效果图如下所示: 本次教程分为7天,内容分别为: 第一天,准备 功能需求 可行性分析 其他准备 第二天,UI 选择合适的UI 第三天,整体架构 第四天,首页列表 界面编写 实体类 显示数据 缓存内容 第五天,详情页与其他 界面编写 实体类 显示数据 设置与关于 第六天,高级功能 夜间模式 版本适配 第七天,发布与开源 在Google Play上线 在GitHub开源 思考 好了,废话不多说了。现在就开始吧。 DAY 1 俗话说,万事开头难,准备工作做好了,可以起到事半功倍的作用。磨刀不误砍柴工嘛。 Day 1,功能需求 在开始正式编码之前,咱们还是得先把要实现的功能一一列出来,后面实现起来才有方向嘛。我认为咱们需要实现的功能有: 正确获取消息列表并展示…

使用 RenderScript 实现高斯模糊(毛玻璃/磨砂)效果

前言 逛 Instagram 的时候,偶然发现,Instagram 的对话框设计的很有意思,如下图: 它的 dialog 的背景竟然是毛玻璃效果的,看起来很漂亮,恩,我是说对话框和迪丽热巴都漂亮😂。看到这么好的效果,当然就要开始搞事情了,自己动手实现差不多的效果。最终的实现效果如下图: 分别实现了对话框背景的虚化和手动调节虚化程度。 实现方法对比 最开始想要实现毛玻璃效果时,我是一脸懵逼的,不知道如何下手。幸亏,有万能的 Google。搜索之后发现常见的实现方法有4种,分别是: RenderScript Java算法 NDK算法 openGL 处理一整张图片这么大计算量的工作,openGL 的性能最好,而用 java 实现肯定是最差的了。而 RenderScrip t和 NDK 的性能相当,但是你懂得,NDK 和 openGL 我无可奈何,综合考虑,RenderScript 应该是最适合的。 但并不是说 RenderScript 就是完全没有问题的: 模糊半径(radius)越大,性能要求越高,模糊半径不能超过25,所以并不能得到模糊度非常高的图片。 ScriptIntrinsicBlur 在API 17时才被引入,如果需要在 Android 4.2 以下的设备上实现,就需要引入 RenderScript Support…

Lambda 表达式在 Android 中的应用

前言 Android 支持完整的 Java7 特性,而升级到 Android Nougat(API Level 24) 之后,支持了 Java8 语言的一部分功能: 默认和静态接口方法 Lambda 表达式(在 API 级别 23 及更低版本中也可用) 重复注解 方法引用(在 API 级别 23 及更低版本中也可用) 类型注解(在 API 级别 23 及更低版本中也可用) 准备工作 使用这一部分支持的功能需要一个名为Jack的新编译器。 (Jack 工具链已经被废弃, 请看这里: ) 而 Jack 要求…

提升体验 – 支持 Chrome Custom Tabs

前言 文章比较长,先放项目地址: PaperPlane. 实际效果: 什么是Custom Tabs? 所有的APP开发者都面临这样一个选择,当用户点击一个URL时,是应该用浏览器打开还是应该用应用内置的WebView打开呢? 两个选项都面临着一些问题。通过浏览器打开是一个非常重的上下文切换,并且是无法定制的。而WebView不能和浏览器共享数据并且需要需要手动去处理更多的场景。 Chrome Custom Tabs让APP在进行网页浏览时更多的控制权限,在不采用WebView的情况下,这既能保证Native APP和网页之间流畅的切换,又允许APP定制Chrome的外观和操作。可定义的内容如下: toolbar的颜色 进场和退场动画 给Chrome的toolbar、overflow menu和bottom toolbar添加自定义操作 并且,Chrome Custom Tabs允许开发者对Chrome进行预启动和网页内容的预加载,以此提升加载的速度。 Chrome Custom Tabs VS WebView, 我应该什么时候用? 如果页面的内容是由我们自己控制的,可以和Android组件进行交互,那么,WebView是一个好的选择,如果我们的应用需要打开外部的网站,那么推荐使用Chrome Custom Tabs,原因如下: 导入非常简单。不需要编写额外的代码来管理请求,授予权限或者存储cookie 定制UI: Toolbar 颜色 动作按钮 (Action Button) 定制菜单项 定制进场退场动画 Bottom Toolbar…

简洁优雅地实现夜间模式

前言 Android 6.0 Marshmallow 预览版中曾经短暂出现过相关的夜间模式的功能,只是在正式版中被移除了,在 Android 7.0 Nougat 上,用户们再次经历了「得而复失」的遗憾,在开发者预览版中,夜间模式和暗色模式先是开启,然后有再次被移除。而在正式版中,夜间模式也没有出现。但其实相关的代码一直存在于系统中,只是默认没有被开启。如何开启这项功能,可以参考少数派的这一篇文章,帮你找回 Android 7.0 夜间模式的 2 款应用。 不过,今天要介绍的主要内容并不是关于系统的夜间模式,而是如何给我们开发的 APP 添加夜间模式的功能。毫不夸张的说,夜间模式现在已经是阅读类 App 的标配了。事实上,日间模式与夜间模式就是给 APP 定义并应用两套不同颜色的主题。用户可以自动或者手动的开启。我们先看两个我认为实现地很优雅的例子:知乎和 Twitter 。 这两个 APP 在切换的工程中,并没有出现闪现黑屏的情况,切换也比较顺滑。我们的目标就是利用 Support Library 实现同样的效果。 实现 添加依赖 准备资源 1. 让我们自己的主题继承并应用DayNight主题: 如果你使用了 Material Design Components, 那么从 v1.1.0…