
Android开发
文章平均质量分 81
Android开发过程实现以及源码分析总结
忙忙碌碌一头羊
这个作者很懒,什么都没留下…
展开
-
ViewModel使用以及源码分析(二)-SavedState
前言在ViewModel使用以及源码分析(一)中,我们留了一个小尾巴SavedStateHandle没有讲解,这部分设计的内容比较多,本篇开始讲解。主要就是涉及到保存的一些知识。1. 概念1.1 SavedState 概念SavedState 是为了弥补 ViewModel 无法直接感知 onSaveInstanceState 被触发的时机的缺陷而产生的。在页面即将被销毁的时候,每个使用 SavedState 的 ViewModel 都会创建一个 Bundle 来存储自己的这份数据,最后这些原创 2021-07-09 15:13:37 · 846 阅读 · 0 评论 -
Activity 中的 onSaveInstanceState方法的调用时机
Activity为我们提供了两个回调方法onSaveInstanceState和onRestoreInstanceState 用于当Activity在不是用户主动意识关闭的情况下来进行页面数据的保存和恢复。那么那些情况下onSaveInstanceState会被调用呢?这个就是写个Demo就会一目了然了。分别有以下几种情况:当用户按下Home键 app处于后台,此时会调用onSaveInstanceState 方法当用户按下电源键时,会调用onSaveInstanceState 方法当Activi原创 2021-07-08 22:16:30 · 1238 阅读 · 0 评论 -
Lifecycle 使用与源码分析
一、Lifecycle 介绍Lifecycle是一个生命周期感知组件,一般用来响应Activity、Fragment等组件的生命周期变化,并将变化通知到已注册的观察者。有助于更好地组织代码,让代码逻辑符合生命周期规范,减少内存泄漏,增强稳定性。这些组件可帮助您生成更易于组织且通常更轻量级的代码,这些代码更易于维护。二、使用方法先来看一下如何使用,这样再去分析源码就能有的放矢1.添加依赖:在app或者module目录下的build.gradle中,添加依赖:这里介绍Androidx 项目引入li原创 2021-07-05 15:25:03 · 627 阅读 · 0 评论 -
Android 9.0 PM机制系列(六)APK解析
前言在本系列的前面文章中,我介绍了PackageInstaller的初始化和安装APK过程、PMS处理APK的安装和PMS的创建过程,这些文章中经常会涉及到一个类,那就是PackageParser,它用来在APK的安装过程中解析APK,那么APK是如何被解析的呢?这篇文章会给你答案。1.引入PackageParserAndroid世界中有很多包,比如应用程序的APK,Android运行环境的JAR包(比如framework.jar)和组成Android系统的各种动态库so等等,由于包的种类和数量繁多,原创 2021-06-28 23:06:01 · 1187 阅读 · 3 评论 -
Android 9.0 PM机制系列(五)PMS启动流程
前言PMS的创建过程分为两个部分进行讲解,分别是SyetemServer处理部分和PMS构造方法。其中SyetemServer处理部分和AMS和WMS的创建过程基本类似。1. SyetemServer处理部分PMS是在SyetemServer进程中被创建的,SyetemServer进程用来创建系统服务。从SyetemServer的入口方法main方法开始讲起,如下所示。frameworks/base/services/java/com/android/server/SystemServer.jav原创 2021-06-28 16:06:51 · 1425 阅读 · 0 评论 -
DNS 优化之IP直连
移动互联网中,DNS解析的失败率是联网失败占比很大的一种。有时候改用https传输后,多次遇到运营商DNS劫持导致客户端在进行握手认证的时候失败,进而无法正常使用。为了优化这个问题,我们使用了IP 直连。即,从服务端拉取一个配置文件,里面包含了域名到IP的映射。客户端每次联网时根据域名在配置文件里面找到对应IP,直接使用IP进行请求。注意配置文件拉取。使用Get请求,尽量使用请求简单的URL,减少出错概率。并且这个时候不能使用IP直连,避免IP改变时拉取失败。Host头设置。对于一个IP主机挂载多原创 2021-06-25 10:57:52 · 1805 阅读 · 0 评论 -
Android 系统源码——下载到编译
前言一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常编译调试了。但是一直没有记录过程,导致每次需要下载的时候都要重新查找一下过程,这里进行一下总结。1. 下载准备Android源码到模拟器运行,主要有的四个步骤:下载源码搭建编译环境准备编译我使用的环境是Ubuntu16.04 、openJDK8、Android 9.0.0硬件要求:如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 maste原创 2021-06-23 10:42:56 · 806 阅读 · 0 评论 -
Android 4.4 PM机制系列(四) APK安装需要空间分析
前言在 Android 9.0 PM机制系列(四) APK安装需要空间分析以及 Android 6.0 PM机制系列(四) APK安装需要空间分析两篇文章中,我们重点分析了Android9.0以及Android6.0所需要的最小APK安装存储空间大小。本篇我们要分析Android4.4安装APK所需要空间大小。1. 开始安装分析源码,一直跟到PMS里面,发现和Android9.0,6.0一样,安装核心代码开始处就在handleStartCopy方法,代码如下:/frameworks/base/ser原创 2021-06-22 17:23:47 · 1083 阅读 · 0 评论 -
Android 6.0 PM机制系列(四) APK安装需要空间分析
前言在Android 9.0 PM机制系列(四) APK安装需要空间分析文章中,我们重点分析了Android9.0需要的最小APK安装存储空间大小。结论就是:只要系统空间小于Math.min(getTotalSpace的5%,500M)+ PackageHelper.calculateInstalledSize(pkg, abiOverride),系统就会报空间不足。正当以为所有的系统都大抵如此,但是没想到在Android6.0上面,当空间存储只有30M的时候,依旧可以安装10M的应用。这到底是怎么回事原创 2021-06-21 22:48:39 · 634 阅读 · 0 评论 -
Android 9.0 PM机制系列(四) APK安装需要空间分析
前言在PM机制系列前三篇,我们着重分析了安装的整个流程,没有具体到很多细节问题。这一篇文章我们就会具体到很多细节问题。本篇主要就是围绕一个问题展开:安装APK到底需要多少空间不会报错INSTALL_FAILED_INSUFFICIENT_STORAGE?可以提高我们的安装成功率。1. 分析结果时序图DCS: DefaultContainerServiceSMS: StorageManagerServiceSM: StorageManager调用关系图如下所示,后面会进行具体分析原创 2021-06-21 16:15:24 · 1110 阅读 · 0 评论 -
Android 9.0 PM机制系列(三)PMS处理APK的安装
前言在上一篇文章 Android9.0 PM机制系列(二)PackageInstaller安装APK中,我们学习了PackageInstaller是如何安装APK的,最后会将APK的信息交由PMS处理。那么PMS是如何处理的呢?这篇文章会给你答案。1.PackageHandler处理安装消息接着上一篇文章的代码逻辑来查看PMS的installStage方法。frameworks/base/services/core/java/com/android/server/pm/PackageManagerS原创 2021-06-20 23:34:15 · 1066 阅读 · 2 评论 -
Android9.0 PM机制系列(二)PackageInstaller安装APK
前言在本系列上一篇文章Android9.0 PM机制系列(一)PackageInstaller初始化解析中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInstaller是如何安装APK的。本系列文章的源码基于Android9.0。1.PackageInstaller中的处理紧接着上一篇的内容,在PackageInstallerActivity调用startInstallConfirm方法初始化安装确认界面后,这个安装确认界面就会呈现给用户,用户如果想要原创 2021-06-20 22:17:56 · 2228 阅读 · 0 评论 -
Android9.0 PM机制系列(一)PackageInstaller初始化解析
前言包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一。包指的是Apk、jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一个机制来进行包的加载、解析、管理等操作,这就是包管理机制。包管理机制由许多类一起组成,其中核心为PackageManagerService(PMS),它负责对包进行管理,如果直接讲PMS会比较难以理解,因此我们需要一个切入点,这个切入点就是常见的APK的安装。讲到APK的安装之前,先了解下PackageMa原创 2021-06-20 21:01:24 · 1639 阅读 · 1 评论 -
Android Studio无法执行Java类的main方法问题及解决方法
在项目.idea/gradle.xml:新增一行代码<?xml version="1.0" encoding="UTF-8"?> <GradleProjectSettings> <option name="delegatedBuild" value="false" /> 添加这行代码 </GradleProjectSettings>原创 2021-06-01 22:14:55 · 188 阅读 · 0 评论 -
FLAG_ACTIVITY_NEW_TASK与FLAG_ACTIVITY_CLEAR_TOP的理解纠正
1.单独的FLAG_ACTIVITY_NEW_TASK并不等价于启动模式 singleTask,它仅表示寻找activity所需的任务栈压入,(即TaskAffinity指定的任务栈,TaskAffinity默认为应用包名)2.FLAG_ACTIVITY_NEW_TASK+FLAG_ACTIVITY_CLEAR_TOP也不等价于启动模式singleTask3.在FLAG_ACTIVITY_NEW_TASK+FLAG_ACTIVITY_CLEAR_TOP的情况下,AndroidManifest.xml中设转载 2021-05-19 14:17:46 · 1098 阅读 · 0 评论 -
MediaSession框架源码分析
这篇是MediaSession框架使用、源码分析以及实战第二篇。文章目录前言源码分析客户端MediaBrowser分析MediaBrowserService分析服务端前言主要从源码的角度来说一下MediaSession框架。在分析源码之前一定要熟悉MediaSession框架的使用,这样就可以直接看源码进行分析。首先,我们在第一篇说到,MediaSession框架由客户端+中间framework+服务端组成。App开发可以由客户端+服务端组成就可以。客户端和服务端代码使用方式大概如下所示:客户端:原创 2021-02-02 16:25:30 · 1727 阅读 · 2 评论 -
MediaSession框架使用、源码分析以及实战
最近在和某音乐App合作项目中使用到,特此进行整理分析。需求是需要获取某音乐播放的状态以及歌曲封面等内容。整理后基本上分成三部分来写吧。前言本文系列主要分成三部分。1. MediaSession框架使用.2. MediaSession框架源码分析.3. MediaSession框架实战App.本文主要讲MediaSession框架使用。文章目录MediaSession框架使用媒体应用架构概览使用媒体会话开发音频应用音频应用概览构建媒体浏览器服务构建媒体浏览器客户端媒体会话回调MediaSe原创 2021-02-01 19:22:09 · 3797 阅读 · 1 评论 -
Myers差分算法分析
目录论文地址摘要定义二级目录三级目录编辑图解决方案概念贪婪算法最优坐标snake坐标组算法实现(伪代码)论文地址paper论文地址: https://neil.fraser.name/writing/diff/myers.pdf摘要对于两个序列A、B,寻找其最长公共子序列的问题与寻找其最短编辑过程(从A到B)的问题一直被认为是一对对偶问题。本文证明了它们等价于在一个编辑图中找到最短/最长路径。基于这个观点,我们找到了一个简单的O(ND)时间与空间复杂度的算法,其中N为A与B的长度和,D为AB间最原创 2021-02-01 15:56:26 · 890 阅读 · 0 评论 -
局部刷新架构代码分析
在 页面局部刷新实现中,我们说到了,局部更新可以使用ArrayObjectAdapter类 setItems()方法。本文主要分析ArrayObjectAdapter类 setItems()方法。代码如下所示:public void setItems(final List itemList, final DiffCallback callback) { if (callback == null) { this.mItems.clear();原创 2021-02-01 15:10:11 · 421 阅读 · 0 评论 -
页面局部刷新实现以及DiffUtil源码剖析
页面局部刷新实现以及DiffUtil源码剖析页面局部刷新实现局部刷新代码结构分析Myers差分算法分析DiffUtil源码分析#页面局部刷新实现页面局部刷新实现主要用在局部实现方法/** * 通过DiffCallback实现局部视图刷新 */ protected void updateDiff(Block<DisplayItem> newAppData) { try { if (newAppData == nul原创 2021-02-01 14:55:48 · 532 阅读 · 0 评论