Android 基础 | 进阶
文章平均质量分 95
开发者如是说
这个作者很懒,什么都没留下…
展开
-
当 Adapter 遇上 Kotlin DSL,无比简单的调用方式
早在去年的时候我就提到过使用工厂的方式获取 Adapter 而不是为每个 Adapter 定义一个类文件。这样的好处是,对于不是那么复杂的 Adapter 可以节省大量的代码,提升开发效率和解放双手,同时更好的支持多类型布局效果。1、Kotlin DSL 和 Adapter 工厂方法可以把 Kotlin DSL 当作构建者使用。这里有一篇不错的文章,想了解的可以阅读下,https://www.ximedes.com/2020-04-21/kotlin-dsl-tutorial/Kotlin DS原创 2021-09-11 23:02:17 · 372 阅读 · 0 评论 -
建议收藏,从 jCenter 迁移到 MavenCentral 完整方案
发布到 Maven Central 相关的教程挺多的,但是大部分存在问题。这篇文章是我在解决了很多问题的基础之上总结的,用来帮助需要的同学避免重蹈覆彻。需要的可收藏,万一用到了呢~1、Farewell to Bintray jCenter首先,告别下 bintray jcenter. 相比于 Maven Central,bintray jcenter 的性能和方便性确实好得多。可惜,jcenter 将要关闭了。jcenter 还是给我提供了很多的便利,对于其关闭深表可惜:2、发布到 Maven Ce原创 2021-04-15 10:46:44 · 1816 阅读 · 1 评论 -
拥抱新的交互方式,在 Android 中应用 MVVM
1、个人的开源库不知不觉维护自己的几个开源库已经快两年了,现在我已经成功地将它们应用到了我的多个产品上面,比如 言叶。通过使用这些开源库能够大大降低开发的复杂度,为我节省大量的代码,提高效率。前些日子忙着做应用的新特性,现在终于有了些许时间。这里介绍下我的开源库,以及我做个人开发过程中如何通过新特性和技巧简化开发的。其实之前我也写了很多文章了介绍自己的设计了,这应该是最后一篇了吧,所以尽可能做到集大成吧。2、JetpackGoogle 最新推出的 Jetpack 里出了很多好玩的框架,这里我的 V原创 2021-03-04 18:14:52 · 330 阅读 · 3 评论 -
为你的应用集成谷歌结算(客户端集成+服务端校验)
最近在开发自己的一款新产品 言叶,上架到谷歌商店之后有国外用户反馈想要使用谷歌支付,于是我准备为自己的应用集成谷歌结算以允许用户进行内购付款。之前我完全没用集成过谷歌支付,从寻找到的一些资料来看,谷歌结算的开发方式已经做了调整,新的开发方式比之前使用 AIDL 开发要简单一些。1、客户端集成1.1 文档资料对于客户端集成,官方文档已经给了比较详尽的说明,这里对应的文档资料提供一下:库集成文档《将 Google Play 结算库集成到您的应用中》,链接:https://developer.andr原创 2020-12-21 16:04:51 · 1376 阅读 · 7 评论 -
个人开源库的一些更新,兼谈Jetpack和Kotlin给Android开发带来的变化
前段时间,我开发完成了新的软件 移动工具箱。最近,我准备把开发过程中总结的一些东西沉淀到自己个人开源的几个库中。最新的一些更新中运用了 Kotlin 和 Jetpack 的一些语法特性,故此总结一下。Jetpack 和 Kotlin 出来已经很久了,然而很多应用开发还停留在 MVP 以及 Java 阶段,即便使用了 Kotlin,很多人只不过是像使用 Java 一样在使用 Kotlin. 实际上,如果能够结合 Kotlin 和 Jetpack 的语法特性,可以大大提升我们日常开发的效率。下面,我以个人开源库原创 2020-10-11 23:35:48 · 371 阅读 · 0 评论 -
加固了就安全了?几个措施让你的 Android 应用更安全
1、背景最近新开发了一款工具类型的软件 移动工具箱,然而某天下午忽然群里来了一个不速之客说我的软件被破解了。虽然,该软件无需付费并且没有广告(很良心 ???? ),也进行了安全加固,但是还是很轻易得被别人破解了。现象是,启动页换成了别人的页面,需要用户点击页面上的按钮分享几次破解者的信息才能进入应用。并且,每次打开应用都是如此。看到这我的心情还是非常复杂的。一开始觉得自己做个应用都赚不到钱,还要被这些人利用。本是同根生,相煎何太急呀。然而,转念一想,这里有些东西还是可以学习一下,于是我去他们的链接下载了原创 2020-09-30 13:13:44 · 753 阅读 · 0 评论 -
一个高性能、功能丰富、可自定义的 Android 相机库 iCamera 的设计和开发过程
1、背景介绍去年年初的时候写过一篇文章 《CameraX:Android 相机库开发实践》,那时我想自己写一个 Android 相机库,但是因为名字和谷歌关放的 CameraX 冲突了,所以现在我将自己的项目改名为 iCamera.之前的文章中也交代过一些 Android 相机库的背景,本身集成相机功能到自己的项目中并不复杂,但是如果设计一个功能全面的 Android 相机库就没那么简单了——你要满足更多用户的需求,基本的缩放、闪光灯等这些在日常开发中不会涉及的功能都要支持;此外,你还要处理相机的各种支原创 2020-08-31 23:22:56 · 1589 阅读 · 0 评论 -
2020 年,我这样在项目中使用 MVVM
最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水。我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架。在这段时间的使用过程中,我踩过一些坑,也积累了一些经验,为了将其推广到其它到项目中又专门封装出了一个库。当然,Jetpack 所提供的组件已经比较完善,我的工作只能算是锦上添花。下面我就介绍下,现在我是如何在项目中使用 Jetpack MVVM 的。1、后起之秀和黯然失色的 MVPMVP 非常强大,也是或者曾经是很多大公原创 2020-05-23 11:46:56 · 725 阅读 · 0 评论 -
Android 高级面试-3:语言相关
主要内容:Kotlin, Java, RxJava, 多线程/并发, 集合1、Java 相关1.1 缓存相关LruCache 的原理DiskLruCache 的原理LruCache 用来实现基于内存的缓存,LRU 就是最近最少使用的意思,LruCache 基于 LinkedHashMap 实现。LinkedHashMap 是在 HashMap 的基础之上进行了封装,除了具有哈希功能,...原创 2019-02-20 00:30:32 · 374 阅读 · 0 评论 -
Androd 应用启动过程的源码分析
在之前的文中,我们已经了解过了 Android 系统启动的过程。系统启动之后会由 PMS 安装系统应用,并启动 Launcher,也就是桌面程序。然后,我们安装的程序的图标将会显示到桌面上面。所谓应用启动过程分成两种情形,一个是应用进程已经建立,一种是应用进程没有建立的情况下。后者需要先创建应用进程,然后再执行启动的过程。安卓系统中的应用在源码中的位置是 platform/packages/a...原创 2019-02-24 18:06:49 · 267 阅读 · 0 评论 -
Android 高级面试-2:IPC 相关
内容IPC 就是指跨进程通信。IPC 相关的内容,涉及的主要有:常见的 IPC 通信方式;Binder 相关;两种序列化方式及其对比;问题IPCAndroid 上的 IPC 跨进程通信时如何工作的简述 IPC?进程间通信的机制AIDL 机制Bundle 机制IPC 就是指进程之间的通信机制,在 Android 系统中启动 Activity/Service 等都涉及跨...原创 2019-02-18 19:59:11 · 349 阅读 · 0 评论 -
Android 高级面试-1:Handler 相关
要点难点:MQ 的 next() 方法,enqueueMessage() 方法,因为它们与 Native 层的 Looper 和 MQ 关联。重点:消息如何分发next() 方法如何退出Handler 与线程对应起来的原理题目Handler 实现机制(很多细节需要关注:如线程如何建立和退出消息循环等等)关于 Handler,在任何地方 new Handler 都是什么...原创 2019-02-18 19:56:45 · 1788 阅读 · 0 评论 -
Android:解析 SurfaceView & TextureView
1、关于 SurfaceView 和 TextureView1.1 基础SurfaceView 以及 TextureView 均继承于 android.view.View,属于 Android 提供的控件体系的一部分。与普通 View 不同,它们都在独立的线程中绘制和渲染。所以,相比于普通的 ImageView 它们的性能更高,因此常被用在对绘制的速率要求比较高的应用场景中,用来解决普通 Vi...原创 2019-02-23 18:11:47 · 3512 阅读 · 0 评论 -
AlertDialog、PopupWindow 与 Activity 之间区别
我们想要实现的效果如下所示:如果我们使用Android的PopDialog的话实现这种效果会比较繁琐,我们可以通过自定义对话框解决这个问题:public class PopDialogController { public static void showSortDialog(Activity activity, View view, OnMenuItemSelectedLi...原创 2018-08-14 11:01:54 · 2885 阅读 · 1 评论 -
RxJava 系列-4:RxJava 源码分析
在之前的文章中我们介绍了 RxJava 2 的常用的 API 的方法总结、背压的概念以及 RxJava 2 在项目中的实际应用。在本节中,我们将要对 RxJava 2 的源码进行分析。下面是之前文章的一些链接,如果对 RxJava 2 的使用比较感兴趣,你可以通过下面的文章进行学习:RxJava2 系列-1:一篇的比较全面的 RxJava2 方法总结RxJava2 系列-2:背压和 Flow...原创 2019-02-22 23:31:14 · 256 阅读 · 0 评论 -
Android 高级面试-4:虚拟机相关
内存管理属于基础知识组织下语言即可,内存模型放在 Java 并发相关;虚拟机执行系统是重点,包括,类加载机制(类的加载、校验阶段,与热补丁原理相关)学习这一块的内容可以参考:《JVM 系列-1:虚拟机内存管理》《全面理解Java内存模型 JMM 及volatile关键字》1、内存管理GC 回收策略Java 中内存区域与垃圾回收机制垃圾回收机制与调用 System.gc() 区别...原创 2019-02-22 00:17:33 · 439 阅读 · 0 评论 -
浅谈 ViewModel 的生命周期控制
1、从一个 Bug 说起想必有过一定开发经验的同学对 ViewModel 都不会陌生,它是 Google 推出的 MVVM 架构模式的一部分。这里它的基础使用我们就不介绍了,毕竟这种类型的文章也遍地都是。今天我们着重来探讨一下它的生命周期。起因是这样的,昨天在修复程序中的 Bug 的时候遇到了一个异常,是从 ViewModel 中获取存储的数据的时候报了空指针。我启用了开发者模式的 “不保留活...原创 2019-01-15 17:46:53 · 8612 阅读 · 2 评论 -
Android 系统源码-1:Android 系统启动流程源码分析
现在我们来梳理下 Android 系统的启动过程。Android 启动过程还是比较重要的,因为在这个过程中除了要完成 Linux 系统的初始化工作还要完成 Android 的基础服务和启动界面的初始化工作。在这篇文章中,我们不打算过多深入源码。因为 Android 中任何一个功能模块在 Framework 层都涉及大量的代码调用。过多深入源码只会让我们迷失在一层层的调用栈中。相比之下,我更倾向于...原创 2019-01-20 16:41:56 · 1164 阅读 · 1 评论 -
在 Android 中使用 JNI 的总结
最近在研究 Android 相机相关的东西,因为想要对相机做一个封装,于是想到要提供支持滤镜和图像动态识别相关的接口。在我找到一些资料中,它们的实现:一个是基于 OpenGL 的,一个是基于 OpenCV 的。两者都可以直接使用 Java 进行开发,受制于 Java 语言的限制,所以当对程序的性能要求很高的时候,Java 就有些心有余力不足了。所以,有些实现 OpenCV 的方式是在 Native...原创 2019-03-02 11:51:05 · 486 阅读 · 0 评论 -
Android 插件化框架 DynamicLoadApk 源码分析
DynamicLoadApk 应该算是 Android 插件化诸多框架中资历比较老的一个了。它的项目地址在:dynamic-load-apk。该项目运行之后的效果是,使用 Gradle 编译出插件包和宿主包,都是以 APK 的形式。安装宿主包之后,通过 ADB 将插件包 push 到手机中。启动宿主包时,它会自动进行扫描将插件加载到应用中。点击插件之后,进入到插件的应用界面。印象中最初接触的插件...原创 2019-03-02 13:44:08 · 342 阅读 · 0 评论 -
Android 高级面试-5:四大组件、系统源码等
1、四大组件1.1 ActivityQ:在两个 Activity 之间传递对象还需要注意什么呢?对象的大小。Intent 中的 Bundle 是使用 Binder 机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder 线程,所以一个线程能占用的缓冲区就更小了(有人以前做过测试,大约一个线程可以占用 128 KB...原创 2019-02-26 23:35:20 · 584 阅读 · 0 评论 -
Android 与计算机视觉
不管你是否从事计算机视觉相关的工作,了解这方面的内容总是好的,因为即使你现在的工作与 AI 无关,采用一些开放的 API 仍然有可能让你的应用做得更好。比如,百度开发平台就提供了许多 AI 相关的 API,像当下比较受欢迎的“白描”等应用,其实就是使用了百度的 API。所以,你也可以考虑一下能否借助一些语音和文字识别等功能来赋能自己的应用。因为我们所做的计算机视觉的东西更多的是对图片进行处理,这...原创 2019-07-18 18:59:29 · 687 阅读 · 0 评论 -
一款现代、高效的 Android 图片压缩框架
本项目主要基于 Android 自带的图片压缩 API 进行实现,提供了开源压缩方案 Luban 和 Compressor 的实现,解决了单一 Fie 类型数据源的问题,并在它们的基础之上进行了功能上的拓展。该项目的主要目的在于:提供一个统一图片压缩框库的实现,集成常用的两种图片压缩算法,让你以更低的成本集成图片压缩功能到自己的项目中。1、项目背景:开源的图片压缩库现在 Github 上的图片...原创 2019-05-18 17:21:02 · 4193 阅读 · 3 评论 -
CameraX:Android 相机库开发实践
前言前段时间因为工作的需要对项目中的相机模块进行了优化,我们项目中的相机模块是基于开源库 CameraView 进行开发的。那次优化主要包括两个方面,一个是相机的启动速度,另一个是相机的拍摄的清晰度的问题。因为时间仓促,那次只是在原来的代码的基础之上进行的优化,然而那份代码本身存在一些问题,导致相机的启动速度无法进一步提升。所以,我准备自己开发一款功能完善,并且可拓展的相机库,于是 Camera...原创 2019-04-23 23:26:47 · 5528 阅读 · 5 评论 -
常用的 CMake 指令总结
CMamke 的官方文档:https://cmake.org/cmake/help/v3.0/manual/cmake-commands.7.html1. cmake_minimum_required设置 CMake 项目要求的最低的版本:cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] ...原创 2019-03-18 15:23:57 · 569 阅读 · 0 评论 -
开源一个 Android 图片压缩框架
在我们的业务场景中,需要使用客户端采集图片,上传服务器,然后对图片信息进行识别。为了提升程序的性能,我们需要保证图片上传服务器的速度的同时,保证用于识别图片的质量。整个优化包括两个方面的内容:相机拍照的优化:包括相机参数的选择、预览、启动速度和照片质量等;图片压缩的优化:基于拍摄的图片和从相册中选择的图片进行压缩,控制图片大小和尺寸。在本文中,我们主要介绍图片压缩优化,后续我们会介绍如何...原创 2019-03-12 23:40:27 · 1268 阅读 · 0 评论 -
Android 性能优化 - 启动优化
1、基础1.1 启动的类型首先是启动的三种类型:冷启动场景:后台完全没有任何进程的情况下,启动最慢;温启动场景:按返回键退回主界面再从主界面打开的情形,较快;热启动场景:按 Home 键退回到主界面再从主界面打开的情形,最快。应用启动的过程实际上也就是 Activity 启动的流程,所以具体涉及的源码不是我们这里的重点,你可以查找 Activity 启动流程相关的文章来了解源码。...原创 2019-01-15 00:12:31 · 1845 阅读 · 0 评论 -
Android 性能优化-ANR 的原因和解决方案
1、出现 ANR 的情况满足下面的一种情况系统就会弹出 ANR 提示输入事件(按键和触摸事件) 5s 内没被处理;BroadcastReceiver 的事件 ( onRecieve() 方法) 在规定时间内没处理完 (前台广播为 10s,后台广播为 60s);Service 前台 20s 后台 200s 未完成启动;ContentProvider 的 publish() 在 10s 内...原创 2019-01-09 12:10:11 · 3749 阅读 · 1 评论 -
使用 Java 命令行生成 JNI 头文件
按照《Android 开发艺术探索》的方式直接照抄别人的命令是不行的,我的开发环境是 Java 环境而不是 Android,所以各种路径跟 Android 项目稍有区别。首先,我在 me/shouheng/jni 目录下面创建一个类文件 JniTest.java,那么该文件的包名也相应地变成 me.shouheng.jni。然后,我们在 jni 目录下面使用命令javac JniTest.ja...原创 2018-10-18 11:02:24 · 1108 阅读 · 0 评论 -
Android 动画详解:属性动画、View 动画和帧动画
在 Android 中,基本的动画共有三种类型:View 动画:也叫视图动画或者补间动画,主要是指 android.view.animation 包下面的一些类,只能被用来设置给 View,缺点是比如当控件移动之后,接收点击的控件的位置不会跟随移动,并且能够实现的效果只有移动、缩放、旋转和淡入淡出操作四种及其组合。Drawable 动画:也叫 Frame 动画或者帧动画,其实可以划分到视图动...原创 2018-11-04 00:46:58 · 1156 阅读 · 0 评论 -
Android 消息机制:Handler、MessageQueue 和 Looper
在这篇文章中,我们将会讨论 Android 的消息机制。提到 Handler,有过一些 Android 开发经验的都应该很清楚它的作用,通常我们使用它来通知主线程更新 UI。但是 Handler 需要底层的 MessageQueue 和 Looper 来支持才能运作。这篇文章中,我们将会讨论它们三个之间的关系以及实现原理。在这篇文章中,因为涉及线程方面的东西,所以就避不开 ThreadLocal...原创 2018-11-04 18:30:30 · 1300 阅读 · 0 评论 -
View 体系详解:View 的工作流程
1、View 树的加载流程当我们调用 startActivity() 方法的时候,会调用到 ActivityThread 中的 performLaunchActivity() 获取一个 Activity 实例, 并在 Instrumentation 的 callActivityOnCreate() 方法中调用 Activity 的 onCreate() 完成 DecorView 的创建。这样我...原创 2018-11-04 00:03:25 · 966 阅读 · 1 评论 -
Android 基础回顾:Activity 基础
1、Activity 的生命周期1.1 一般情况下的生命周期下图是一般情况下一个 Activity 将会经过的生命周期的流程图:关于上图中生命周期方法的说明:onCreate() / onDestroy():onCreate() 表示 Activity 正在被创建,可以用来做初始化工作;onDestroy() 表示 Activity 正在被销毁,可以用来做释放资源的工作;onStar...原创 2019-01-12 22:27:13 · 996 阅读 · 0 评论 -
浅谈 LiveData 的通知机制
LiveData 和 ViewModel 是 Google 官方的 MVVM 架构的一个组成部分。巧了,昨天分析了一个问题是 ViewModel 的生命周期导致的。今天又遇到了一个问题是 LiveData 通知导致的。而 ViewModel 的生命周期和 LiveData 的通知机制是它们的主要责任。所以,就这个机会我们也来分析一下 LiveData 通知的实现过程。关于 ViewModel ...原创 2019-01-18 00:16:57 · 1259 阅读 · 0 评论 -
Android 性能优化 - 布局优化
1. 合理选择 ViewGroup在选择使用 Android 中的布局方式的时候应该遵循:尽量少使用性能比较低的容器控件,比如 RelativeLayout,但如果使用 RelativeLayout 可以降低布局的层次的时候可以考虑使用。Android 中的控件是树状的,降低树的高度可以提升布局性能。RelativeLayout 的布局比 FrameLayout、LinearLayout 等简...原创 2019-01-10 23:34:56 · 800 阅读 · 0 评论 -
承上启下:重构 Markdown 笔记应用 MarkNote
1、关于项目MarkNote 是一款 Android 端的笔记应用,它支持非常多的 Markdown 基础语法,还包括了 MathJax, Html 等各种特性。此外,你还可以从相机或者相册中选择图象并将其添加到自己的笔记中。这很酷!因为你可以将自己的游记或者其他图片拍摄下来并将其作为自己笔记的一部分。这也是笔者开发这款软件的目的——希望 MarkNote 能够成为一款帮助用户记录自己生活的笔记...原创 2018-12-16 23:07:21 · 1181 阅读 · 2 评论 -
Android EventBus 的源码解析
1、EventBus 的使用1.1 EventBus 简介EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。首先是 EventBus 的三个重要角色Event:事件,它可以是任意类型...原创 2018-11-12 00:14:49 · 778 阅读 · 0 评论 -
Android 多线程编程:IntentService & HandlerThread
因为 Android 是使用 Java 开发的,所以当我们谈及 Android 中的多线程,必然绕不过 Java 中的多线程编程。但在这篇文章中,我们不会过多地分析 Java 中的多线程编程的知识。我们会在以后分析 Java 并发编程的时候分析 Java 中的多线程、线程池和并发 API 的用法。我们先来总结一下 Android 多线程编程的演变过程:首先是 Java 的 Thread。因为本身...原创 2018-11-05 22:22:05 · 848 阅读 · 0 评论 -
Android 内存缓存框架 LruCache 的源码分析
LruCache 是 Android 提供的一种基于内存的缓存框架。LRU 是 Least Recently Used 的缩写,即最近最少使用。当一块内存最近很少使用的时候就会被从缓存中移除。在这篇文章中,我们会先简单介绍 LruCache 的使用,然后我们会对它的源码进行分析。1、基本的使用示例首先,让我们来简单介绍一下如何使用 LruCache 实现内存缓存。下面是 LruCache 的一...原创 2018-11-13 12:56:43 · 775 阅读 · 0 评论 -
马克笔记—Android 端开源的 Markdown 笔记应用
马克笔记是运行在Android设备上面的一款开源的Markdown笔记,它的功能开发得已经比较完善,已经能够满足大部分用户的需求。现在将其开源到Github上面,用来交流和学习。当然,更希望你能够参与到项目的开发当中,帮助马克笔记变得更加有用。1、关于马克笔记马克笔记是一款开源的Markdown笔记应用,它的界面设计采用了Google最新的Material Design风格。该笔记现在的功...原创 2018-11-05 18:18:25 · 3925 阅读 · 2 评论