Android知识
文章平均质量分 87
CallmeZhe
晨曦微露,正义气奋发!
我用双手,成就妳的梦想!
展开
-
Android应用程序是如何请求SurfaceFlinger服务渲染一个Surface的?
在前面一篇文章中,我们分析了Android应用程序请求SurfaceFlinger服务创建Surface的过程。有了Surface之后,Android应用程序就可以在上面绘制自己的UI了,接着再请求SurfaceFlinger服务将这个已经绘制好了UI的Surface渲染到设备显示屏上去。在本文中,我们就将详细分析Android应用程序请求SurfaceFlinger服务渲染Surface的过程。Android应用程序在请求SurfaceFlinger服务渲染一个Surface之前,首先要将该Sur...转载 2021-06-03 10:58:15 · 429 阅读 · 0 评论 -
Android应用程序是如何请求SurfaceFlinger服务创建一个Surface的?
连接上SurfaceFlinger服务之后,Android应用程序就可以请求SurfaceFlinger服务创建Surface。而当有了Surface后,Android应用程序就可以用来渲染自己的UI了。在本文中,我们将详细分析Android应用程序请求SurfaceFlinger服务创建Surface的过程。在讲述Android应用程序请求SurfaceFlinger服务创建Surface之前,我们首先了解一个Surface是由什么组成的。我们可以将Surface理解为一个绘图表面,Androi..转载 2021-05-10 17:51:09 · 508 阅读 · 0 评论 -
Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析
Android应用程序成功连接上SurfaceFlinger服务之后,还需要一块匿名共享内存来和SurfaceFlinger服务共享它的UI元数据,以便使得SurfaceFlinger服务可以正确地为它创建以及渲染Surface。在本文中,我们将详细地分析这块用来保存UI元数据的匿名共享内存的创建过程。用来保存Android应用程序的UI元数据的匿名共享内存最终是被结构化为一个SharedClient对象来访问的。每一个与UI有关的Android应用程序进程有且仅有一个SharedClient对象,.转载 2021-04-19 18:00:49 · 244 阅读 · 0 评论 -
Android应用程序窗口的绘制过程,即Surface的渲染过程
Android应用程序窗口的绘图表面在创建完成之后,我们就可以从上到下地绘制它里面的各个视图了,即各个UI元素了。不过在绘制这些UI元素之前,我们还需要从上到下地测量它们实际所需要的大小,以及对它们的位置进行合适的安排,即对它们进行合适的布局。在本文中,我们就将详细地分析Android应用程序窗口的测量、布局以及绘制过程。从前面Android应用程序与SurfaceFlinger服务的关系概述和学习计划这一系列的文章可以知道,Android应用程序窗口请求SurfaceFlinger服务创建了一个绘.转载 2022-06-16 16:21:15 · 1673 阅读 · 0 评论 -
Android应用程序窗口Activity与SurfaceFlinger服务的连接过程,即Surface的创建过程
在前文中,我们分析了应用程序窗口连接到WindowManagerService服务的过程。在这个过程中,WindowManagerService服务会为应用程序窗口创建过一个到SurfaceFlinger服务的连接。有了这个连接之后,WindowManagerService服务就可以为应用程序窗口创建绘图表面了,以便可以用来渲染窗口的UI。在本文中,我们就详细分析应用程序窗口的绘图表面的创建过程。我们知道,每一个在C++层实现的应用程序窗口都需要有一个绘图表面,然后才可以将自己的UI表现出来。这个绘.转载 2022-04-02 14:24:23 · 932 阅读 · 0 评论 -
Android应用程序窗口与WindowManagerService服务的连接过程,即WindowState的创建过程
Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求WindowManagerService为其增加一个WindowState对象,用来描述它的窗口状态。在本文中,我们就详细分析Activity组件与WindowManagerService的连接过程。我们从两方面来看Activity组件与WindowManagerService服务之间的连接。一方面是从Activity组件到WindowManagerService服务的连接,.转载 2021-12-29 10:16:59 · 897 阅读 · 0 评论 -
Android应用程序窗口Activity的视图View的创建过程,即DecorView的创建过程
从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口。每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图。应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的。在本文中,我们就详细分析应用程序窗口视图的创建过程。应用程序窗口内部所包含的视图对象的实际类型为DecorView。DecorView类继承了View类,是.转载 2021-11-26 17:22:13 · 535 阅读 · 0 评论 -
Android应用程序窗口(Activity)的窗口对象(Window)创建过程,即PhoneWindow的创建过程
在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的。在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow,.转载 2021-10-21 16:06:44 · 1041 阅读 · 0 评论 -
Android应用程序窗口Activity的运行上下文Context的创建过程,即创建ContextImpl的创建过程
我们知道,Android应用程序窗口的运行上下文环境是通过ContextImpl类来描述的,即每一个Activity组件都关联有一个ContextImpl对象。ContextImpl类继承了Context类,它与Activity组件的关系如图1所示:图1 ContextImpl类与Activity类的关系图这个类图在设计模式里面就可以称为装饰模式。Activity组件通过其父类ContextThemeWrapper和ContextWrapper的成员变量mBase来引用了一个ContextImp.转载 2021-08-17 09:29:41 · 583 阅读 · 0 评论 -
Android应用程序与SurfaceFlinger服务的连接过程分析
前文在描述Android应用程序和SurfaceFlinger服务的关系时提到,每一个有UI的Android应用程序都需要与SurfaceFlinger服务建立一个连接,以便可以通过这个连接来请求SurfaceFlinger服务为它创建和渲染Surface。在本文中,我们将以Android系统的开机动画应用程序为例,详细描述Android应用程序是如何与SurfaceFlinger服务建立连接的。Android系统的开机动画是由应用程序bootanimation来实现的,它位于/system/b...转载 2021-03-23 15:34:08 · 380 阅读 · 0 评论 -
Android应用程序与SurfaceFlinger服务关系概述
SurfaceFlinger服务负责绘制Android应用程序的UI,它的实现相当复杂,要从正面分析它的实现不是一件容易的事。既然不能从正面分析,我们就想办法从侧面分析。说到底,无论SurfaceFlinger服务有多复杂,它都是为Android应用程序服务的,因此,我们就从Android应用程序与SurfaceFlinger服务的关系入手,来概述和制定SurfaceFlinger服务的学习计划。 SurfaceFlinger服务运行在Android系统的System进程中,它负责管理Andr...转载 2021-03-09 14:45:25 · 331 阅读 · 0 评论 -
Android开发重点---差值器和估值器,使用动画的注意事项,Drawable、Canvas、Bitmap关系,Window的内部机制,Activity,Dialog,Toast的Window创建
差值器和估值器差值器一般指时间差值器TimeInterpolator,是设置 属性值 从初始值过渡到结束值 的变化规律,比如匀速,加速,减速等等。可以通过xml属性和java代码设置。系统默认的差值器是AccelerateDecelerateInterpolator,即先加速后减速。//匀速插值器设置android:interpolator="@android:anim/linear_interpolator"或alphaAnimation.setInterpolator(new Lin原创 2021-05-18 10:03:25 · 552 阅读 · 1 评论 -
阿里ARouter全面全面全面解析(使用介绍+源码分析+设计思路)
概述arouter是android实现组件化的路由框架,涉及到的功能有activity、fragment的跳转、跳转带参数、自定义服务、自定义拦截器、拦截下沉、重定向url都是Arouter里面定义的功能,可能用过Arouter的小伙伴们只用过Arouter的跳转以及跳转功能带参数的功能,像它的自定义服务、拦截器、全局降级策略、重定向功能都是很不错的功能,下面我会一一介绍这些功能该怎么使用。使用介绍1.基础依赖1.1.java版本的依赖在需要使用Arouter的module中添加如下转载 2021-02-06 19:11:34 · 6765 阅读 · 0 评论 -
巧用RecyclerView ItemDecoration 实现炫酷视差效果
目录概述分析实现概述最近项目又开始大刀阔斧的改版迭代,PM也再次开始了其疯狂CX大法。不过对此早已习以为常了,毕竟我们也曾经看懂过这么一本书《RR is PM》。哈哈,有点扯远了,回归正题,先来看看这次要实现的交互效果(CX目标):简单描述下,界面就是一个横向列表,滑动的时候,背景图跟着一起滑动,并且附带视差效果,随着滑动距离增加,背景图一直在循环展示。看到这种效果,列表方案肯定是首选RecyclerView,接着看这背景视差效果,首先想到的就是通过绘制background的方式转载 2021-02-01 08:36:00 · 466 阅读 · 1 评论 -
两年多的 Android SDK 开发经验,分享给大家
前言:偶然看到一篇分享SDK开发的文章,正看的叫好时,顿觉,独享不如众享,便转载过来,输入的同时也输出。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~在公司做了两年多的 SDK 开发,结合自己的所知所学,分享一些 SDK 开发的经验。SDK 是什么相信做 Android 开发的朋友,一定使用过第三方的 SDK,比如推送 SDK、分享 SDK 等。SDK转载 2021-01-29 15:10:38 · 774 阅读 · 0 评论 -
Android 性能优化“基石”是什么? Fps,Memory,Cpu如何采集?
想要做好性能优化,最主要的就是学会采集性能。1.背景APM(Application perfmance monitor)就是应用性能监控。在移动互联网对人们生活影响越来越大的今天,App的功能越来越全面,随之而来的就是App性能的要求越来越高,不能被动的等待用户异常的发生然后根据线上日志去修复bug,再发补丁版本。主动监控App性能变得越来越重要,分析App的耗电,UI卡顿,网络性能成为了当物之急。2.抛出问题一个性能数据采集系统,你不能成为一个app的负担,不能在采集的时候耽误主线程的渲染转载 2021-01-24 09:07:03 · 260 阅读 · 0 评论 -
解决JSONObject的toString方法中,若数字小数点后为0,自动省略小数点后0的问题
前言:此问题网上多数是围绕FastJson做的应对,而JSONObject这块目前没有找到,特此记录下!业务场景:APP端上传json数据到服务端,服务端用的JSONObject方式解析,当json串中包含类似xx.00的数据时,用toString方法生成的String类型数据时,里面的xx.00被默认置为xx,又由于MD5加密此字符串生成的密钥与客户端传上来的不相等,导致插入数据失败。调查原因:后由调试服务端代码,发现是JSONObject里面就是这么做的:JSONObject.cla原创 2021-01-05 20:47:25 · 5697 阅读 · 2 评论 -
带你看看从输入URL到页面显示背后的故事
说一说从在浏览器输入URL到整个页面显示这个过程经历了什么?这个问题应该是目前大厂必问的一个面试题,是一个非常综合性的问题,可以考查我们对如HTTP协议的了解,浏览器相关知识的基础。如对html,css文件解析,浏览器如何渲染等,所以如果我们可以把这一题回答的非常清楚一定是非常加分的,并且作为一个前端,如果可以很深入的了解这些知识对自己的专业能力提升也时常非常大的,我们可以直接应用到自己的工作中,如之前文章中说的性能优化等,这是迈向高级前端非常重要的一步。本文会介绍浏览器从发送请求开始,到接受到服务转载 2021-01-12 09:47:11 · 239 阅读 · 0 评论 -
Android开发必知-图片拍照,选择,裁剪,压缩(适配高版本)
ps:这篇文章只是整理偏常规的图片开发知识点。下面走起~拍照在7.0之前,我们设置拍照保存的文件地址的 Uri,都是直接Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径),但是 7.0之后,对用户权限提高了保护,之前那种方式行不通了,所以我们要做7.0的判断,用 FileProvider 获取设置保存的文件 Uri,然后放到Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径)中,代码如下:原创 2020-12-27 20:57:34 · 552 阅读 · 1 评论 -
Android各版本迭代信息整理及适配
Android在版本迭代中,总会进行很多改动,下面我们一起梳理下。Android 4.4发布ART虚拟机,提供开启选项 HttpURLConnection的底层实现替换成OkHttpAndroid 5.0ART成为默认虚拟机,完全替代Dalvik虚拟机 Context.bindService() 方法需要显式 Intent,如果提供隐式 intent,将引发异常。Android 6.0增加运行时权限限制如果你的应用使用到了危险权限,比如在运行时进行检查和请求权限。checkSelf原创 2020-12-24 21:31:28 · 560 阅读 · 1 评论 -
Android 11新存储行为变更及老版本升级适配
上周开发项目的时候,做了Android11存储方案升级适配,因为之前创建的文件是在外部公有目录下,为了延续老用户的使用习惯,项目组决定继续在外部公有目录下写入、读取文件的方案。为了拿到相应的访问权限,用到了下面这个标签。 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />官方文档上也有介绍,我这里截取了关键部分做了相关编码后,本以为就万事大吉了,哪成想Google P原创 2020-11-30 11:05:37 · 2042 阅读 · 0 评论 -
Android系统手机开机画面各个阶段代码执行流程分析(Part2)
3. 第三个开机画面的显示过程第三个开机画面是由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,如下所示:service bootanim /system/bin/bootanimation user graphics group graphics disabled oneshot应用程序bootanimation的用户和用户组名称分别被设置为graphics。注意,用来启动应...转载 2020-12-04 13:39:32 · 789 阅读 · 0 评论 -
Android系统手机开机画面各个阶段代码执行流程分析(Part1)
提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了。Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。本文将详细分析这三个开机画面的显示过程,以便可以开启我们对Android系统UI实现的分析之路。第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。无论是哪一个画面,它们都是在一个称转载 2020-12-03 10:41:36 · 1349 阅读 · 0 评论 -
Android四大组件Content Provider的共享数据更新通知机制分析
在Android系统中,应用程序组件Content Provider为不同的应用程序实现数据共享提供了基础设施,它主要通过Binder进程间通信机制和匿名共享内存机制来实现的。关于数据共享的另一个话题便是数据更新通知机制了,即如果一个应用程序对共享数据做了修改,它应该如何通知其它正在使用这些共享数据的应用程序呢?本文将分析Content Provider的共享数据更新通知机制,为读者解答这个问题。Android应用程序组件Content Provider中的数据更新通知机制和Android系统中的广播.转载 2020-11-27 09:00:43 · 486 阅读 · 0 评论 -
Android四大组件Content Provider在应用程序之间共享数据的原理分析
Android应用程序之间不能直接访问对方的数据文件的障碍在于每一个应用程序都有自己的用户ID,而每一个应用程序所创建的文件的读写权限都是只赋予给自己所属的用户,因此,就限制了应用程序之间相互读写数据的操作。我们知道,Binder进程间通信机制可以突破了以应用程序为边界的权限控制来实现在不同应用程序之间传输数据,而Content Provider组件在不同应用程序之间共享数据正是基于Binder进程间通信机制来实现的。虽然Binder进程间通信机制突破了以应用程序为边界的权限控制,但是它是安全可控的,因为.转载 2020-11-26 10:59:34 · 954 阅读 · 0 评论 -
Android四大组件Content Provider的启动过程源代码分析
通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口。Content Provider一般是运行在独立的进程中的,每一个Content Provider在系统中只有一个实例存在,其它应用程序首先要找到这个实例,然后才能访问它的数据。那么,系统中的Content Provider实例是由谁来负责启动的呢?本文将回答这个问题。Content Provider和应用程序组件Activity、Service一样,需要在AndroidM.转载 2020-11-25 09:12:10 · 377 阅读 · 0 评论 -
Android四大组件Content Provider使用实例
本文包含两个应用程序,其中,第一个应用程序命名为ArticlesProvider,它使用了SQLite数据库来维护一个文章信息列表,同时,它定义了访问这个文章信息列表的URI,这样,我们就可以通过一个Content Provider组件来向第三方应用程序提供访问这个文章信息列表的接口;第二个应用程序命名为Article,它提供了管理保存在ArticlesProvider应用程序中的文章信息的界面入口,在这个应用程序中,用户可以添加、删除和修改这些文章信息。接下来我们就分别介绍这两个应用程序的实现。1.转载 2020-11-24 08:57:15 · 723 阅读 · 0 评论 -
Android四大组件Broadcast中发送广播sendBroadcast流程源代码详解
前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待ActivityManagerService将广播分发过来。ActivityManagerService是如何得到广播并把它分发出去的呢?这就是本文要介绍的广播发送过程了。广播的发送过程比广播接收器的注册过程要复杂得多了,不过这个过程仍然是以ActivityManagerService为中心。广播的发送者将广播发送到ActivityManagerService,ActivityManagerSer..转载 2020-11-23 09:39:13 · 1674 阅读 · 0 评论 -
Android四大组件Broadcast中注册广播registerReceiver流程源代码详解
在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。在软件工程中,是非常强转载 2020-11-22 15:19:30 · 674 阅读 · 0 评论 -
Android四大组件Service中startService过程源代码详解
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验。Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务。在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的。在主进程调用startService函数时,会通过Binder进程间通信机制来通知Acti.转载 2020-11-20 09:41:23 · 306 阅读 · 0 评论 -
Android系统Launcher的启动流程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由Syste转载 2020-12-23 09:37:57 · 514 阅读 · 0 评论 -
Android中应用程序安装流程SystemServer->ServerThread->PackageManagerService源码梳理
应用程序包管理服务PackageManagerService安装应用程序的过程,其实就是解析析应用程序配置文件AndroidManifest.xml的过程,并从里面得到得到应用程序的相关信息,例如得到应用程序的组件Activity、Service、Broadcast Receiver和Content Provider等信息,有了这些信息后,通过ActivityManagerService这个服务,我们就可以在系统中正常地使用这些应用程序了。应用程序包管理服务PackageManagerService是系统启转载 2020-12-11 18:34:52 · 332 阅读 · 0 评论 -
Android 新建一个APP进程的源代码分析(ActivityManageService->Zygote->ActivityThread)
Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.main比较好理解,即进程创建完成之后,Android应用程序框架层就会在这个进程中将ActivityThread类加载进来,然后执行它的m转载 2020-12-08 11:11:07 · 416 阅读 · 0 评论 -
Android四大组件Service中bindService过程源代码详解
Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动Service的方法。我们先简单回顾一下这个应用程序实例绑定Service的过程。在这个应用程序的MainActivity的onCreate函数中,会调用bindService来绑定一个计数器服务CounterService,这里绑定的意思其实就是在MainActivity内部获得CounterServi.转载 2020-11-21 12:17:16 · 485 阅读 · 0 评论 -
Android应用程序内部启动Activity过程(startActivity)的源代码分析
上文介绍了Android应用程序的启动过程,即应用程序默认Activity的启动过程,一般来说,这种默认Activity是在新的进程和任务中启动的;本文将继续分析在应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。在应用程序内部启动非默认Activity的过程与在应用程序启动器Launcher中启动另外一个应用程序的默认Activity的过程大体上一致的,因此,这里我们着重关注有差别的地方。我们先来看一下应用程序的配置文件AndroidM.转载 2020-11-19 08:46:37 · 446 阅读 · 0 评论 -
Android应用程序点击Launcher图标启动新进程的源代码分析(二)
接上篇文章继续分析。Step 16.ActivityThread.handlePauseActivity 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:public final class ActivityThread { ...... private final void handlePauseActivity(IBinder token, boolean finished,...转载 2020-11-18 22:02:45 · 465 阅读 · 0 评论 -
Android应用程序点击Launcher图标启动新进程的源代码分析(一)
前文简要介绍了Android应用程序的Activity的启动过程。在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程。在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。这种启动方式的特点是会启动一个新的进程来加载相应的Activity。这里,我们继续以这个例子为例来说明Andr.转载 2020-11-18 10:42:36 · 898 阅读 · 0 评论 -
深入认识Android中View工作原理之View绘制
上篇文章认识了下View从XML文件-->View对象的流程,里面用到了递归的方式来不断查找Layout文件中的ViewTag,利用反射方式,生成相对应View对象,添加到parent中,最后添加到DecorView,也就是我们的根布局里。好,我们现在拿到了View实例,接下来还要处理从View实例传递到手机屏幕上显示,实时刷新,保证60Hz(一帧约为16ms),怎么可以更快的绘制,双缓冲,三缓冲策略等等非常复杂的问题。Android在framework曾已经搭建好这一整套的流程框架,我们大多数情况下原创 2020-11-17 13:12:56 · 306 阅读 · 0 评论 -
深入认识Android中View工作原理之View加载
既然分析View,咱就先从View加载这块当做入口先来看一下LayoutInflater的基本用法吧,它的用法非常简单,首先需要获取到LayoutInflater的实例,有两种方法可以获取到,常用的如下:LayoutInflater layoutInflater = LayoutInflater.from(context);另外一种写法:LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService原创 2020-11-16 12:03:35 · 244 阅读 · 0 评论 -
Android 内存泄露简介、典型情景及检测解决
什么是内存泄露?Android虚拟机的垃圾回收采用的是根搜索算法。GC会从根节点(GC Roots)开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉。内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,导致不能及时回收这个对象所占用的内存。内存泄露积累超过Dalvik堆大小,就会发生OOM(OutOfMemory)。内存泄露的经典场景转载 2020-05-11 15:15:20 · 259 阅读 · 0 评论