- 博客(56)
- 收藏
- 关注
原创 Configuration Change派发到App进程
null) {// 先触发进程相关的Configuration变化} else {if (!// 再触发Activity相关的Configuration的变化.....
2025-04-01 13:56:09
642
原创 Android系统APP之SettingsProvider
那么,从方法ensureSettingsStateLocked()到insertSettingLocked()方法,这个过程表明,有一个对象SettingsState,指向文件/data/system/users/0/settings_system.xml,持有变量mSettings,而mSettings持有封装了设置项的name, value, packageName的对象Setting,换句话说,settings_system.xml文件中的所有的设置项间接被SettingsState持有。
2024-11-12 19:31:17
1294
1
原创 MATCH_DIRECT_BOOT_AWARE和MATCH_DIRECT_BOOT_UNAWARE
用于查询在设备锁定模式下能够运行的应用和组件。:用于查询在设备锁定模式下不能运行的应用和组件。通过结合使用这两个标志位,可以全面了解设备上所有应用的Direct Boot支持情况。这些标志位在开发需要在设备锁定状态下工作的应用时非常有用,可以帮助开发者更好地理解和管理应用的行为。
2024-11-01 17:46:49
574
原创 来聊聊Activity的显示原理
到这里其实整个流程就算完成了,来总结一下:创建了对象,往对象里面添加了一个DecorView为DecorView绑定一个,由这个负责View的绘制和刷新通过向WMS发起Binder调用,而WMS也会通过IWindow向应用端发起调用会在WMS里面注册一个窗口,然后由WMS统一的管理所有窗口的大小,位置和层级在第一次绘制时,还会向WMS申请一块Surface,有了Surface之后,应用端就可以进行绘制了绘制完之后,就会按照WMS里面提供的层级等信息进行合成,最终显示。
2024-09-20 17:11:11
814
1
原创 Android IME输入法启动&显示&隐藏流程梳理
阅读Android AOSP 12版本代码,对输入法IME整体框架模块进行学习梳理,内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程,以及常见问题和调试技巧。
2024-09-19 17:12:39
2461
原创 Systrace - 锁竞争解读
上面这段话翻译过来就是ActivityTaskManagerService 的 getFocusedStackInfo 方法在执行过程中被阻塞,原因是因为执行同步方法块的时候,没有拿到同步对象的锁的拥有权;需要等待拥有同步对象的锁拥有权的另外一个方法ActivityTaskManagerService.activityPaused 执行完成后,才能拿到同步对象的锁的拥有权,然后继续执行。
2024-09-19 17:05:02
1123
原创 android:configChanges分析
在ensureActivityConfiguration,首先得到此次发生的配置改变值0x2004,值存储在变量changes,然后调用shouldRelaunchLocked,判断是否能内部消化掉这次改变。这些事件一旦发生,当前活动的Activity会重新启动,其中的过程是:在销毁之前会先调用onSaveInstanceState()方法去保存你应用中的一些数据,然后调用onDestroy()方法,最后调用onCreate()、onStart()、onResume()等方法启动一个新的Activity。
2024-08-26 15:48:12
2811
原创 android 源码导入android studio
假如你的电脑性能足够好(内存大于16G,代码下载在SSD上),那么可以直接打开Android Studio,点击"Open an existing Android Studio project"选项,找到并选中刚刚生成的"android.ipr"文件,点击OK,就可以开始导入项目了。"android.iml"和"android.ipr"一般是"只读"的属性,我们这里建议大家,把这两个文件改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况,执行如下两条命令即可。在设置中将实时内存显示打开。
2024-08-05 13:28:20
752
原创 Android mLruProcesses的分布结构
在AMS的内部属性中使用mLruProcesses集合保存所有的进程信息,AMS将所有进程按照优先级从低到高的顺序保存着对应的ProcessRecord信息,即排在前面的进程优先级越低,当系统内存不足时优先被Killer杀死;在AMS的工作过程中,会不断调用updateLruProcessLocked()方法进行进程排序,在mLruProcesses()中保存按照以下规则保存数据。
2024-07-31 10:29:12
404
原创 Android 触控事件处理机制
用户手指点击按压屏幕后,屏幕触控驱动产生中断,Linux内核会将硬件产生的触控事件包装成Event放在设备的dev/input/目录下。如何从设备上读取触控事件?读取到触控事件后该如何派发事件?派发事件时如何找到接收事件的目标应用窗口?找到目标应用窗口后如何将事件传递到目标窗口?目标应用窗口内部中的事件如何处理?下面将结合最新Android 11系统源码,通过分析回答这些问题来了解Android系统触控事件处理机制的全貌。
2024-07-25 14:30:14
1593
原创 ActivityThread中的handleLaunchActivity什么时候执行
决定启动Activity时,它会通过IPC(Inter-Process Communication)调用目标应用程序进程中的。: 当一个Activity需要被启动时,通常是因为用户点击了一个应用图标或是在一个应用中选择了某个选项。总的来说,当Activity启动的意图被系统接收并处理后,包含了Activity的各种信息,如组件名称、启动模式、任务栈信息等。方法中,根据消息的类型,它会调用相应的处理方法。中被调用,以完成Activity的创建和初始化过程。在Android的Activity启动流程中,
2024-07-23 17:05:11
498
原创 Android Vold挂载的时序图
2.Disk中的Create方法会先通过binder方式调用onDiskCreated(getId(), mFlags)通知framework层的StorageManagerService,告诉其创建了Disk;4.StorageManagerService收到创建volume完成的消息后,会通过binder的方式回调mount的方法,这里首先会回调Binder服务端VoldNativeService中的mount方法,然后再调用VolumeBase中的mount方法。
2024-07-23 11:29:48
407
原创 Android 11 Unable to start/bind service
今天在Android11上发现了一个的问题,如果目标Service的进程没有启动,那么无论是bindService还是startService都没有办法拉起指定的Service。上面的包可见性问题不仅Service有这个问题,Activity也有这么问题哈,记录一下,避免有朋友也遇到同样的问题。上面的方法都试过了**然并卵**,还是报Unable to start service Intent.配置完了,赶紧拿起手机试了试,重启手机~bind目标service,终于bind成功了~//....代码省略。
2024-07-22 16:22:52
814
原创 android Surface.java中mNativeObject的作用
在Android的Surface类中,是一个长整型变量(long),它实际上是一个本地指针,用于在Java层和Native层之间桥接。存储了一个指向Native层Surface对象的引用,这个Native层的对象封装了与硬件和服务交互的所有细节。
2024-07-17 11:43:17
455
原创 android的parcel序列化的逻辑
Parcel,翻译过来是“打包”的意思。打包干什么呢?是为了序列化。如果要在进程之间传递一个整数,很简单,直接传就是行了;如果要传一个字符串,就稍微复杂了点:需先分配一块可以容纳字符串的内存,然后将字符串复制到内存中,再传递(新手可能问:为啥不直接把字符串的引用传过去呢?学过C/C++的地球人都知道:进程有自己的内存地址空间,一个进程中的1000地址可能在另一个进程中是100000,java对象的引用跟本上还是内存地址);再如果要传递一个类的实例呢?也是先为类分配内存,然后复制一份再传递可以吗?
2024-07-09 19:44:18
797
原创 android的Service的两种启动方式
在Android中,Service有两种主要的启动方式:通过和。这两种方式各有其用途和生命周期特性,下面将详细介绍每种方式及其应用场景。
2024-07-09 19:35:58
485
原创 android App中注册的receiver限制了1000个,是指App进程中所有receiver还是针对同一个Action的还是1000
如果一个应用注册了过多的广播接收器,它可能会导致其他应用或系统服务的性能下降。在Android中,限制注册的1000个广播接收器(Broadcast Receivers)指的是单个应用程序进程内的所有广播接收器的总数,而不仅仅是针对同一Action的数量。总之,这个限制是针对单个应用进程内的所有广播接收器,而不是特定Action的限制,因此开发者需要合理规划和管理应用中广播接收器的使用,避免不必要的资源消耗。方法),还是在AndroidManifest.xml中静态声明的,它们都会被计入该限制内。
2024-07-08 11:47:38
302
原创 android中ViewRootImpl与mSurface之间的关系
在Android的UI框架中,和Surface之间的关系非常紧密,因为它们共同参与了从视图绘制到屏幕显示的整个过程。
2024-07-05 15:38:49
360
原创 android中window和SurfaceView各自都对应一个surface吗
使用“双缓冲”机制来达到高效的界面刷新效果,即在后台缓冲区完成绘制后,才将内容交换到前台显示,避免了屏幕闪烁问题。可以独立于主线程执行复杂的图形操作,例如视频播放或者游戏画面的渲染,而不会阻塞UI线程,从而保证了UI的流畅性。则是Android框架中的一个更高层次的概念,它代表了应用程序的可视化容器,可以包含多个。通过创建一个置于应用窗口之后的新窗口,与宿主窗口分离,它可以在单独的线程中处理业务,不受。的属性控制,无法进行平移缩放等转换,因为它的主要目标是高效的图形渲染。来绘制内容,而是使用自己的。
2024-07-05 11:20:37
364
原创 Android中焦点的处理流程
在Android中,焦点处理流程通常指的是键盘输入焦点(也称为IME焦点)和视图焦点的变化流程。焦点的概念在UI设计中很重要,因为它决定了用户输入(例如,按键输入)会被哪个视图接收。在实际应用中,开发者可以通过覆盖上述提到的方法来实现特定的焦点行为,比如定制焦点移动逻辑或响应焦点变化事件。
2024-07-04 17:44:16
1029
原创 android中ViewRootImpl和window和Surface的对应关系
是紧密相关的组件,它们协同工作来呈现用户界面。这三个组件共同构成了Android UI渲染的基础架构。则是两者之间的协调者,它接收来自。在Android的UI架构中,是UI的实际渲染目标,而。层次结构的内容映射到。
2024-07-04 17:43:29
430
原创 android的Surface.java的mNativeObject的作用是什么
的值通常是在Java层通过JNI(Java Native Interface)调用Native层代码时生成的。类型的成员变量,它实际上是一个指向Native层的句柄(handle)。是Java层和Native层之间沟通的桥梁,它使得Java层能够控制和访问Native层的。代表一个显示的内容,可以是应用程序的窗口、壁纸、系统UI元素等。对象不再被使用时,应该通过JNI调用Native层的函数来释放与。的管理非常重要,因为它涉及到资源的创建和销毁。对象被创建时,它会关联到一个Native层的。
2024-07-04 16:09:05
451
原创 android中的iwindow和phoneWindow有啥关系
在Android中,IWindow和是窗口管理中的两个重要概念,它们各自扮演着不同的角色,但又紧密相关。
2024-07-04 11:07:36
406
原创 android App的adj的大小及范围
值的范围理论上可以从非常低的负数到正数(如-1000到1000),但实际上大多数常见的进程状态会落在上述提到的范围内。(OomAdj,即Out-of-Memory Adjustment)值是用来表示进程在系统内存管理中的相对重要性,决定系统在内存紧张时哪些进程应该被优先终止。: 这个范围通常是从约900至1000,表示最近使用过的但当前不活跃的缓存进程,最容易被系统回收。: 表示那些可以被系统随时回收以释放内存的缓存进程,这个范围内的值表示不同的缓存进程优先级。在Android系统中,
2024-07-02 10:41:56
725
原创 View的onDetachedFromWindow什么时候被回调
由于这是View与Window解除关联的信号,所以在。:当一个View或者包含该View的ViewGroup被从Window中移除,无论是因为视图层次结构的变化,还是Activity的销毁,:如果View是Fragment的一部分,并且Fragment被移除或替换,那么该View也会脱离Window,触发此方法。:在某些内存管理操作中,如当系统需要回收资源以释放内存时,可能会导致View被移除并触发此回调。导致销毁时,该Activity中的所有View将从Window中分离,从而触发各自的。
2024-07-01 17:44:05
411
原创 View.AttachInfo起什么作用
包括与View关联的Window的句柄、显示信息(如尺寸、密度)、输入通道(InputChannel)等,这些用于控制View的绘制环境和处理用户输入。是确保View能够正确、高效地与其宿主Window交互的基础,涉及从布局、绘制到事件处理的各个方面。在Android系统中扮演着关键角色,它是连接View与Window的重要桥梁。:例如绘制边界、背景绘制信息、动画控制器等,对于View的绘制流程至关重要。:用于通知View关于其状态变化的信息,比如窗口焦点的变化。),确保操作在合适的线程循环中执行。
2024-07-01 17:43:05
398
原创 android View中的onTouchEvent如何区分点击和滑动事件
方法中根据用户的触摸行为区分点击和滑动,并相应地处理这两种交互。请注意,实际应用中可能需要根据具体需求调整阈值和处理逻辑。方法可以区分点击(tap)和滑动(swipe)事件。事件中,计算触碰点的新位置与原始位置之间的距离。如果这个距离超过了预设的阈值(通常使用。获取),则认为是滑动开始。这时,可以设置一个标志(如。事件中,根据之前设置的标志来判断是点击还是滑动结束。在Android的View中,通过重写。)来标记当前正在进行滑动操作。事件时,记录下触碰点的坐标()以及触碰时间(通过。这段代码展示了如何在。
2024-06-27 17:28:13
820
原创 android View中onTouchEvent如何判断点击和滑动事件
方法是处理触摸事件的主要入口点,它允许View对用户的触摸行为做出响应,包括点击和滑动。为了区分点击和滑动事件,你需要在。对象来判断用户的操作意图。用于确定滑动开始前允许的最小移动距离,避免因轻微的手指移动误判为滑动,而。中根据是否发生了滑动来决定是处理点击还是滑动结束的逻辑。则是判断点击的最短时间,防止快速滑动被误认为点击。在Android中,来检测是否有足够的位移来判断为滑动,并在。在这个示例中,我们使用了。来记录触摸点的初始位置和时间,
2024-06-27 17:25:00
563
原创 android的AMS的providerMap中为什么用name和class两种key
两种键是为了兼顾查询效率、管理灵活性以及系统内部处理的需要,确保ContentProvider能够被准确、高效地管理和访问。是用来存储已发布的ContentProvider实例的一个重要数据结构。这个数据结构之所以使用两种类型的键(在Android的ActivityManagerService (AMS) 中,综上所述,AMS中的。
2024-06-25 19:26:31
179
原创 android processRecord 分析
是Android系统管理进程的核心数据结构,它不仅存储着进程的身份信息、状态、优先级等关键数据,还是AMS实施进程生命周期管理、资源调度和错误处理的基石。通过深入理解,开发者可以更好地把握Android系统如何高效、安全地管理应用程序进程。
2024-06-25 19:24:58
543
原创 android handler.sendMessage中msg的理解
等字段)从一个线程安全地传递到另一个线程。这是Android中实现线程间通信的重要方式之一。中扮演着携带并传递数据的关键角色,是实现Android应用中线程间通信的核心组件之一。通常与创建它的线程绑定,特别是与主线程(UI线程)相关的。是一个封装了信息的数据结构,它允许你携带数据(通过。,用于更新UI或执行其他只能在主线程进行的操作。: 当消息到达消息队列的前端并且准备处理时,与该。则发送一个不包含数据对象(obj为空)的消息。,实现了在不同线程间安全地传递和处理消息。则是在指定的延迟时间后发送。
2024-06-25 19:23:54
317
原创 CopyOnWriteArrayList实现线程安全的原理分析
是Java并发包中的一个线程安全的集合类,它通过“写时复制”(Copy-On-Write, COW)策略来实现线程安全,尤其适用于读操作远多于写操作的场景。
2024-06-25 19:19:42
619
原创 Binder的stub和proxy解析 及asBinder
在Android的Binder机制中,Stub和Proxy是实现跨进程通信(IPC)的两个重要概念,它们共同协作以透明化地在不同进程间调用方法。此外,asBinder方法也是Binder机制中的一个关键部分,用于获取Binder对象本身。
2024-06-22 11:09:14
734
原创 android IntentReceiver$Stub$Proxy的说明
是Android系统用于实现跨进程BroadcastReceiver调用的代理类,它基于Binder机制工作,确保了广播可以在不同应用进程之间安全、高效地传递和处理。
2024-06-22 11:07:04
350
原创 android 中IIntentReceiver如何将Broadcast发生给对应进程的
整个过程确保了即使BroadcastReceiver在不同的进程中,也能正确无误地接收到广播消息,体现了Android系统强大的跨进程通信能力。接口是系统用于在不同进程间传递广播的一个重要组件。在Android中,
2024-06-22 10:44:38
300
原创 android 中IIntentReceiver的作用
是一个Binder接口,它扮演着非常重要的角色,尤其是在处理广播(Broadcast)相关的跨进程通信(IPC,Inter-Process Communication)时。其核心作用在于桥接不同进程间的通信,使得一个进程能够接收到来自其他进程(如系统服务或其他应用)的广播意图(Intent)。是Android系统用来管理和协调跨进程广播接收的核心组件,它保证了广播能够在多进程环境中可靠且安全地分发和处理。也参与到权限检查的过程中,确保只有具备相应权限的应用才能接收到特定的广播,增强了系统的安全性。
2024-06-22 10:42:29
451
原创 BroadcastRecord的作用
对象包含了广播的所有相关信息,比如Intent对象(包含Action、Data、Category等)、发送广播的权限、目标接收者列表(包括静态注册和动态注册的BroadcastReceiver)、广播的类型(有序或无序)、以及与广播相关的标志位等。还用于跟踪广播的处理状态,例如当前正在处理的接收者、已经完成处理的接收者列表,以及广播是否已经完成或被abort等状态信息。是Android系统中广播分发机制的内部实现细节之一,对于确保广播的高效、安全、有序分发至关重要。:通过维护关于广播的信息和状态,
2024-06-22 10:39:20
239
原创 Android两种杀掉进程方式总结(System.exit()和Process.killProcess())
Android两种杀掉进程方式总结(System.exit()和Process.killProcess())
2024-06-18 11:01:57
1238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人