Android
文章平均质量分 92
ruiurrui
If you can't fly, then run, if you can't run then walk, if you can't walk then crawl, but whatever you do, you have to keep moving forward.
展开
-
webview中shouldOverrideUrlLoading方法解析
在Android中使用自定义webview的时候,会重写shouldOverrideUrlLoading方法,本文就简单了解一下该方法的作用。原创 2022-05-30 15:04:19 · 5874 阅读 · 0 评论 -
使用ServiceLoader和AutoService实现插(组)件
ServiceLoader可以理解为是一个接口或类的加载器,通过接口或抽象类能够找到实现该接口或抽象类的子类。原创 2022-03-23 19:43:27 · 1722 阅读 · 0 评论 -
Android自定义九宫格手势解锁组件
本文主要介绍Java版本九宫格手势解锁组件的使用和实现原理。原创 2022-02-19 18:26:40 · 1820 阅读 · 1 评论 -
Linux交叉编译FFmpeg
基础准备在Android中使用编译好的FFmpeg,需要先了解一下C/C++编译基础概念,还需要准备一台Linux操作系统的机器。编译流程C/C++编译流程图如下:静态库和动态库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。C和C++库有两种:静态库(.a、.lib)和动态库(.so、.dll)。windows:.lib和.dll库。Linux:.a和.so库。静态库和动态库区别:所谓静态、动态是指链接阶段,如下图所示:1、静态库在编译时链接到目标代码,运行时原创 2022-01-03 22:33:24 · 4043 阅读 · 2 评论 -
Android应用实现Https双向认证
为什么需要双向认证Https保证的是信道的安全,即客户端和服务端通信报文的安全。但是无法保证中间人攻击,所以双向认证解决的问题就是防止中间人攻击。中间人攻击(Man-in-the-MiddleAttack)简称(MITM),是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。若没有开启双向认证,中间人可以拦截客户端发送的请求,然后篡改信息再发送到服务端;中间人也可以拦截服务端返回的信息,再发送到客户端。所原创 2022-01-03 18:58:47 · 3739 阅读 · 4 评论 -
LiveData原理解析
什么是LiveDataLiveData是Android Architecture Components 其中的一个组件。主要用于更新UI数据和组件之间传值。1、LiveData是一种持有可被观察数据的类。它通过观察者模式实现了数据变化的动态通知,即当观察者生命周期处于活跃状态时,能够感知数据的变化。2、能够感知生命周期,内部通过Lifecycle来感知生命周期,在Activity、Fragment、Service中当对应生命周期为Destroy的时候,会销毁观察者,避免内存泄露;原创 2021-11-21 19:12:41 · 4443 阅读 · 0 评论 -
APT技术在Android中的使用
APT技术在Android中的使用APT全称 Annotation Process Tool,是Java提供的注解处理工具,能够帮助开发者在编译阶段生成所需要的可执行代码。在Android开发中,著名的ButterKnife、Dagger2、ARouter都是使用了APT技术,所以作为一名Android开发者,还是有必要了解一下APT技术的使用。Android中使用APT在Android工程中使用APT,首先需要创建两个Java Module,一个是annotation(注解module,也可以是A原创 2021-11-07 16:39:58 · 4025 阅读 · 0 评论 -
轻松搞定应用启动黑白屏
启动白屏现象随着应用体积越来越大,初始化的时候做的事情越来越多,应用在启动的时候,往往会出现一个短暂的白屏现象,对于用户来说体验非常不好,如下图所示:为什么会出现启动白屏?先做个测试:在MainActivity的onCreate方法中,在调用setContentView设置布局前,让延迟执行2秒中,则会出现白屏现象。@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta原创 2021-07-10 15:26:07 · 861 阅读 · 0 评论 -
SharedPreferences原理解析
SharedPreferences介绍SharedPreferences是Android官方的Key-Value键值对形式的轻量级存储方式,能够存储少量的数据,支持基本类型、字符串类型。文件存储路径是/data/data/应用程序包名/shared_prefs。SharedPreferences使用1、创建SharedPreferencesSharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);原创 2021-06-08 18:01:26 · 944 阅读 · 1 评论 -
Android10.0和11.0唯一识别标识设计
应用开发中不管是埋点统计还是推送通知,都会用到唯一识别标识,在Android中设备唯一码有很多,如:MAC地址、IMEI号(DeviceId)、IMSI号、ANDROID_ID、序列号(SerialNumber)等,但并不是所有设备上都能稳定获取到这些值。在10.0以前这些值还能获取到,Mac地址6.0之后通过api是获取不到的,通过扫描硬件端口还能获取,但是10.0之后,这些唯一识别标识都被Android官方禁用了,Mac地址会返回一个虚假的值。原创 2021-01-22 18:52:02 · 6111 阅读 · 10 评论 -
Java线程池原理解析
线程的消耗1、其实 Java 中的线程模型是基于操作系统原生线程模型实现的,也就是说 Java 中的线程其实是基于内核线程实现的,线程的创建,析构与同步都需要进行系统调用,而系统调用需要在用户态与内核中来回切换,代价相对较高,线程的生命周期耗时包括「线程创建时间」,「线程执行任务时间」,「线程销毁时间」,创建和销毁都需要导致系统调用;2、每个 Thread 都需要有一个内核线程的支持,也就意味着每个 Thread 都需要消耗一定的内核资源(如内核线程的栈空间),因此能创建的 Thread 是有限的;3原创 2021-01-20 15:15:09 · 324 阅读 · 0 评论 -
Java线程池的使用
线程池(ThreadPool)是一种多线程处理形式,也就是线程的一种使用模式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。原创 2021-01-08 15:41:30 · 484 阅读 · 0 评论 -
Glide源码解析(3)—缓存加载机制
前言在《Glide源码解析(1)—图片加载流程》一文中主要分析了Glide如何从网络下载并设置到ImageView上加载流程。在《Glide源码解析(2)—Glide实例创建过程》一文中主要分析了Glide的创建流程,包括内存缓存和磁盘缓存的初始化。其中缓存加载机制并没有过多分析,本文就专门分析一下Glide中缓存的加载流程是如何设计的。设置缓存Glide.with(this) .load("https://url") .diskCacheStrategy(DiskCacheStr原创 2020-12-17 13:25:39 · 806 阅读 · 0 评论 -
Glide源码解析(2)—Glide实例创建过程
Glide的使用很简单,就在这简单的三步中就实现了很多复杂的流程,其中就包括Glide的创建,Glide的创建涉及的内容很多,下面就开始分析Glide的创建过程。...原创 2020-12-16 17:58:43 · 296 阅读 · 0 评论 -
Glide源码解析(1)—图片加载流程
Glide加载一张图片Glide源码地址:https://github.com/bumptech/glide原创 2020-12-11 01:13:03 · 275 阅读 · 0 评论 -
Android10.0应用图标隐藏方案(7.0-10.0)
Android7.0 - 10.0应用图标隐藏方案原创 2020-09-23 15:21:03 · 9381 阅读 · 8 评论 -
Framwork源码解析(5)—Activity启动流程(8.0)
调用startActivity启动Activity流程1、 调用启动方法;Intent intent = new Intent();intent.setClassName("packageName","className");startActivity(intent);2、进入Activity类的startActivity方法,@Overridepublic void startActivity(Intent intent) { this.startActivity(intent,原创 2020-08-25 03:20:10 · 577 阅读 · 0 评论 -
Framwork源码解析(4)_ActivityManagerService(AMS)启动流程(8.0)
ActivityManagerService简介ActivityManagerService简称AMS,具有管理Activity行为、控制Activity的生命周期、派发消息事件、内存管理等功能。查看AMS源码之前一定要先看一下前文System_Server进程启动过程:https://blog.csdn.net/u010982507/article/details/104123531以下源码为8.0系统。AMS启动入口从上文中的system_server进程启动流程分析中可以得知,在SystemS原创 2020-08-24 15:26:24 · 325 阅读 · 0 评论 -
Binder机制原理学习笔记(4)_ServiceManager启动Binder分析
在[Framwork源码解析(1)_Zygote进程启动流程](https://blog.csdn.net/u010982507/article/details/104109945)一文中了解过,Android系统启动Zygote进程然后创建SystemService,再创建其他服务进程,ServiceManager 进程也是在这里启动的。查看`/system/core/rootdir/init.rc`源码,可以找到启动servicemanager原创 2020-06-24 18:36:51 · 221 阅读 · 0 评论 -
Binder机制原理学习笔记(3)_Binder机制整体架构和通信流程
Binder整体架构Binder 通信采用 C/S 架构,核心包含 Client、 Server、 ServiceManager 以及 Binder 驱动。其中Server,Client,ServiceManager 运行于用户空间,驱动运行于内核空间。ServiceManager 用于管理系统中的各种服务。Binder使用了面向对象的思想来描述作为访问接入点的Binder及其在Client中的入口:Binder是一个实体位于Server中的对象,该对象提供了一套方法用以实现对服务的请求,就象类的成员原创 2020-06-24 18:20:49 · 326 阅读 · 0 评论 -
Binder机制原理学习笔记(2)_Binder一次Copy原理
Binder 是基于 C/S 架构的。由一系列的组件组成,包括 Client、Server、ServiceManager、Binder 驱动。其中 Client、Server、Service Manager 运行在用户空间,Binder 驱动运行在内核空间。其中 Service Manager 和 Binder 驱动由系统提供,而 Client、Server 由应用程序来实现。Client、Server 和 ServiceManager 均是通过系统调用函数 open、mmap 和 ioctl 来访问原创 2020-06-22 09:02:09 · 1059 阅读 · 0 评论 -
Binder机制原理学习笔记(1)_了解IPC通信及Binder
进程间通信(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(进程是分配资源最小的单位,而线程是调度的最小单位,线程共用进程资源)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。原创 2020-06-21 22:56:24 · 332 阅读 · 0 评论 -
Android_Handler机制原理解析和源码分析
什么是Handler机制在Android开发的过程中,会将耗时的一些操作放在子线程(work thread)中去执行,然后将执行的结果告诉UI线程(main thread),因为UI的更新要通过Main thread来进行(其实特殊子线程也可以更新UI)。那么这里就涉及到了如何将子线程的数据传递给主线程的问题。所以Android系统提供了一个消息传递的机制——Handler,可用于将子线程的数...原创 2020-04-14 22:21:34 · 729 阅读 · 0 评论 -
Apk 打包流程
首先来看一张官网(最新)给的构建流程图1、编译器将源代码转换成 DEX(Dalvik Executable) 文件(其中包括运行在 Android 设备上的字节码),将所有其他内容转换成已编译资源。2、APK 打包器将 DEX 文件和已编译资源合并成单个 APK。不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。3、APK 打包器使用调试或发布密钥库签署您的 APK...原创 2020-03-16 16:53:28 · 1248 阅读 · 0 评论 -
Framwork源码解析(3)_PackageManagerService(PMS或PKMS)启动流程
PackageManagerServic简介PackageManagerService包管理服务,简称PMS或者PKMS,是Android系统中非常重要的一个管理服务,它是在system_server进程中启动的。主要是负责应用的安装卸载更新等工作。PMS启动流程分析一、启动入口从上文中的system_server进程启动流程分析中可以得知,在SystemServer.java类(路径是:...原创 2020-02-06 15:01:38 · 751 阅读 · 0 评论 -
Framwork源码解析(2)_System Server进程启动流程
从上一篇Zygote进程启动过程中,可以看到System Server进程是在Zygote进程中创建出来的。查看`ZygoteInit.java`类,路径是`/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java`,找到main方法,可以看到在main方法中启动了System Server。原创 2020-02-04 13:05:23 · 282 阅读 · 0 评论 -
Framwork源码解析(1)_Zygote进程启动流程
Android系统启动流程先看一张图,从Android系统设备开机到Zygote进程启动,经历了一下几个过程。init进程init进程是linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;Linux中的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。在系统...原创 2020-01-30 22:52:48 · 431 阅读 · 0 评论 -
bsdiff实现APK增量更新原理和实现
增量更新是由差量包和旧安装包合成新的安装包,再进行安装。由于下载的是差量包,所以可以快速升级且节省用户流量。原创 2019-11-03 05:39:57 · 1313 阅读 · 0 评论 -
Bitmap图片去除白色背景
需求最近有个需求要合成证件照片,证件头像是白底的一寸照片,但是用bitmap合成的时候需要透明的头像照片,就需要将照片的白色背景变成透明色。有两种处理方式,推荐使用第一种.第一种:bitmap是不可编辑的不可编辑的bitmap意思是从文件或流中decode的。Bitmap idPortraitTemp = BitmapFactory.decodeFile(portrait); int p...原创 2018-11-28 22:26:19 · 3406 阅读 · 0 评论 -
Android实现外部App互信跳转SDK
需求描述 最近项目上有个需求,要实现外部App跳转到自身App,并在自己App中实现免密登录功能。功能不算难,做个笔记,方便以后使用。功能分析 1、...原创 2018-07-21 14:35:12 · 788 阅读 · 0 评论 -
Android实现自定义相机系列(2)—自定义view图片缩放控件
自定义view图片缩放控件ImageView控件只能展示图片,不能对图片进行手势缩放,此篇文章主要实现对图片的展示和缩放,技能点主要有以下几个方面:继承View,实现自定义View功能绘制bitmap,显示图片实现对图片拖动功能实现对图片的放大缩小功能实现图片的裁剪功能演示效果图直接看代码会枯燥,这里先看下演示效果图 代码实现1、自定义view类CropVi...原创 2018-07-25 23:40:52 · 883 阅读 · 2 评论 -
Android实现自定义相机系列(1)—自定义view裁剪控件
目标本系列文章主要记录自定义相机拍照系列,包括:1、使用Android的Camera API自定义拍照模式,例如人脸拍照,OCR拍照等;2、对拍完的照片进行裁剪;3、自定义图片伸缩view,使用手势对图片进行放大缩小操作;本人写博客也是为了自己学习和分享,也会参考网络上许多文章和开源项目,希望大家一块学习进步。这一篇文章主要介绍自定义裁剪view控件。 ...原创 2018-07-25 10:13:05 · 2437 阅读 · 1 评论