
Android
Android_阿拉拉
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ActivityOptions的用法和作用
类为 Android 应用提供了强大的界面切换效果定制功能,通过合理使用动画效果和共享元素过渡,可以提升用户体验,使应用更加生动和吸引人。是 Android 中用于定义 Activity 之间切换动画效果和共享元素过渡效果的类。首先,在两个 Activity 的布局文件中为共享元素设置相同的。方法可以创建自定义的进入和退出动画。然后,在启动 Activity 时使用。方法,并传入共享元素的视图和。这里指定了进入动画资源文件。原创 2024-10-16 16:30:16 · 761 阅读 · 0 评论 -
View和SurfaceView的区别
View和SurfaceView的区别原创 2024-10-09 19:45:45 · 566 阅读 · 0 评论 -
简述Android中Window Manager的源码解读
请注意,这只是一个非常简化的示例,实际的 Android 系统 Window Manager 源码非常复杂,涉及到多个类和模块的协同工作,并且与其他系统组件(如 View 系统、Activity 管理器等)紧密耦合。在分析实际的源码时,需要深入了解 Android 系统的架构和各个组件之间的交互关系。它协调应用程序窗口与系统窗口(如状态栏、导航栏等)的显示,确保各个窗口能够正确地呈现给用户,并处理窗口之间的层次关系、触摸事件分发等。原创 2024-09-04 21:12:42 · 635 阅读 · 2 评论 -
简述Activity Manager的源码
同时,它还管理着任务栈和返回栈,控制着用户在不同 Activity 之间的导航。此外,Activity Manager 还负责进程管理,决定何时启动新的进程以及何时终止旧的进程,以优化系统资源的使用。Activity Manager 的源码实现了复杂而强大的功能,通过对 Activity 的生命周期、任务栈和进程的精细管理,确保了 Android 系统的稳定性和高效性。理解 Activity Manager 的源码对于深入了解 Android 系统的工作原理以及进行高级应用开发和系统优化都具有重要的价值。原创 2024-09-04 20:59:33 · 1015 阅读 · 0 评论 -
聊一下Android的activity manager
Activity Manager 在启动 Activity 时,会通知 Window Manager 创建一个新的窗口,并将 Activity 的视图添加到该窗口中。Android 的 Activity Manager 是一个非常重要的系统组件,它负责管理 Activity 的生命周期、任务栈以及应用程序的启动和切换等。在切换过程中,Activity Manager 会保存当前应用程序的状态,并恢复目标应用程序的状态,确保用户可以无缝地继续使用目标应用程序。原创 2024-09-04 20:35:11 · 1259 阅读 · 0 评论 -
聊一下Android的binder服务
Android 中的 Binder 服务是基于 Binder 机制实现的一种服务,可以在不同的应用程序或系统组件之间提供特定的功能或数据访问。总之,Android 的 Binder 服务是一种高效、安全、稳定的进程间通信机制,广泛应用于 Android 系统的各个方面。插件化开发:在插件化开发中,Binder 服务可以用来实现插件和宿主应用之间的通信。插件可以通过 Binder 服务向宿主应用注册自己的服务,宿主应用可以通过 Binder 服务调用插件提供的功能。原创 2024-09-04 20:18:14 · 500 阅读 · 0 评论 -
Android中如何在应用crash后,自动跳转到主界面
需要注意的是,这种方式只是一种补救措施,不能替代良好的错误处理和代码稳定性。在实际开发中,应该尽量避免应用崩溃,通过合理的错误处理和测试来提高应用的稳定性。这样,当应用发生未捕获的异常崩溃时,会自动启动主界面(假设主界面是。原创 2024-09-04 15:21:30 · 496 阅读 · 0 评论 -
聊聊Android的架构UDD 界面层 数据层 网域层
通过将 Android 应用架构分为界面层、数据层和网域层,可以实现代码的分离和解耦,提高代码的可维护性、可测试性和可扩展性。每个层次都有其特定的职责和功能,通过清晰的接口进行交互,使得应用的开发更加高效和可靠。这个示例展示了一个简单的架构,其中界面层使用 Jetpack Compose 展示数据,数据层模拟获取数据,网域层定义了数据模型。你可以根据实际需求进一步扩展和优化这个架构。在现代 Android 开发中,通常会将应用架构分为界面层、数据层和网域层,每个层次都有其特定的职责和功能。原创 2024-08-22 16:38:45 · 1188 阅读 · 0 评论 -
apt和kapt的区别
总之,APT 和 KAPT 都是用于处理注解的重要工具,但在语言支持、集成方式、性能、错误处理和生态系统等方面存在一些区别。在选择使用时,需要根据项目的具体需求和技术栈来决定使用哪种工具。如果项目主要使用 Kotlin 开发,特别是在 Android 项目中,KAPT 通常是更好的选择。碰到一个同学去面试,面试官问了他apt和kapt的区别。他只答了一个针对java和一个针对kotlin的区别,貌似面试官不满意。so,总结一下,可能说来说去,还是意会的那些文字,可是你要说出来1234,征服面试官。原创 2024-08-21 11:49:42 · 555 阅读 · 0 评论 -
Android面试:怎么样理解Android系统运行在自己的安全沙箱内?
安装到设备后,每个 Android 应用都运行在自己的安全沙箱内:Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户; 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件; 每个进程都具有自己的虚拟机 (VM),因...原创 2019-03-18 14:03:37 · 510 阅读 · 0 评论 -
Android文件路径报FileNotFoundException问题解决
val musicFile = File(musicPath) if (!musicFile.exists()) { musicPath = URLEncoder.encode(musicPath, "UTF-8") }这个问题主要是路径中含有中文字符或者空格%等特殊符号,需要用UTF8编码一下。...原创 2021-10-12 19:58:35 · 1901 阅读 · 0 评论 -
Looper是如何处理delay message的
例如,假设有一个延迟 5 秒的 Message 被放入 MessageQueue ,在这 5 秒内,Looper 可能会处理其他非延迟或已满足延迟条件的消息。Looper 在不断循环从 MessageQueue 中获取消息时,首先获取的是满足时间条件(即延迟时间已过)的消息。如果当前没有满足时间条件的消息,Looper 会进入等待状态,直到有可处理的消息或者等待超时。这种处理延迟消息的方式使得 Android 能够在合适的时间执行特定的任务或处理相关的消息,有效地实现了定时和延迟操作的功能。原创 2024-08-16 14:34:37 · 147 阅读 · 0 评论 -
webview通常会造成谁的内存泄漏?
加载的网页资源:某些情况下,WebView 加载的网页中的资源(如大型图片、未释放的脚本资源等)可能没有被正确释放,从而占用内存。线程和任务:与 WebView 相关的异步任务或线程,如果在 WebView 不再使用后仍在运行并持有相关引用,可能导致内存泄漏。总之,对于 WebView 相关的各种对象和资源,都需要在适当的时候进行正确的清理和释放,以避免内存泄漏问题。)的强引用,并且在不再使用时没有被正确清理,可能导致内存泄漏。自定义的与 WebView 相关的回调对象:例如自定义的。原创 2024-08-16 11:20:06 · 355 阅读 · 0 评论 -
如何避webview造成的内存泄漏
分离 WebView 与长生命周期对象的关联:避免 WebView 与应用中的单例对象或其他长生命周期对象建立强引用关系。取消网络请求:如果在 WebView 加载网页时有正在进行的网络请求,在合适的时候取消这些请求,防止相关资源无法释放。总之,要时刻注意 WebView 的资源管理和引用关系,及时清理不再需要的资源和引用,以防止内存泄漏。使用弱引用:如果需要在其他地方保留对 WebView 的引用,可以使用弱引用来避免阻止其被回收。)中,停止 WebView 的加载,清理其相关的资源和缓存。原创 2024-08-16 11:18:16 · 358 阅读 · 0 评论 -
WebView 的常见的安全漏洞:
例如,假设一个应用通过 WebView 展示用户生成的评论,如果不对评论内容进行清理和编码,恶意用户可能在评论中插入 XSS 脚本。不安全的证书验证:如果 WebView 没有正确验证服务器证书,可能导致与不安全的服务器建立连接,造成数据泄露。输入验证和清理:对用户输入到 WebView 中的数据进行严格的验证和清理,去除可能包含的恶意脚本代码。编码输出:对从服务器端传递到 WebView 的数据进行适当的编码,防止恶意脚本的注入。头来限制网页可以加载的资源类型和来源,减少潜在的攻击面。原创 2024-08-16 10:34:04 · 886 阅读 · 0 评论 -
说说Binder和AIDL
例如,在 Android 中,一个应用中的 Activity 可能作为客户端,通过 Binder 与系统服务(如 ActivityManagerService)进行通信,以完成诸如启动新 Activity 等操作。AIDL 适用于需要在不同进程之间进行复杂数据交互和方法调用的场景,但其使用相对较为复杂,需要开发者对进程间通信的原理有一定的理解。跨进程通信:允许在不同的应用进程之间进行通信,使得一个进程可以调用另一个进程中服务实现的方法。客户端使用:在客户端中,通过绑定服务来获取 AIDL 接口的实例。原创 2024-08-15 17:09:00 · 871 阅读 · 0 评论 -
为什么说serializable比parcelable在内存中序列化开销高
在序列化和反序列化过程中使用了反射机制。会在序列化的数据中包含一些额外的信息,如类的描述、版本号等,这增加了序列化后数据的大小和处理的复杂性。进行序列化,由于反射和额外信息的存在,序列化和反序列化的时间以及内存消耗都会明显高于使用。提供了更高的灵活性,几乎可以序列化任何对象,但这种灵活性是以性能为代价的。假设我们有一个包含众多属性的用户对象,在频繁进行数据传输的场景中,使用。依赖反射和包含更多额外信息,导致其在内存中序列化的开销相对较高,而。通过更直接和明确的方式实现序列化,能够提供更好的性能和内存效率。原创 2024-08-15 16:41:32 · 238 阅读 · 0 评论 -
讲一下IntentService
是一种方便、高效的方式来处理后台的异步任务,特别适用于那些按顺序执行、不需要与调用者进行直接交互的任务场景。简化了异步任务的处理流程,减少了开发者在多线程和服务管理方面的工作量。假设您正在开发一个图片上传应用,当用户选择多张图片上传时,可以通过。的一个子类,它在处理异步任务方面具有一些独特的特性和优势。例如,如果您有一个需要依次下载多个文件的任务,就可以使用。依次处理每张图片的上传任务,而不会影响应用的响应性。时,将其放入队列,然后在。方法中进行实际的下载操作。每次接收到下载文件的。原创 2024-08-15 16:11:51 · 216 阅读 · 0 评论 -
startService 和bindService的区别
而如果是一个需要与当前界面实时交互获取数据的服务,比如实时获取地理位置信息并更新界面显示,更适合使用。例如,如果要实现一个长期在后台播放音乐的服务,可能会使用。适合于不需要与调用组件直接交互、需要独立运行的服务;则适用于需要与调用组件进行紧密通信和协同工作的服务。是 Android 中用于与。原创 2024-08-15 16:01:14 · 505 阅读 · 0 评论 -
讲一下activity栈的taskAffinity
假设我们有两个应用,应用 A 是一个邮件应用,应用 B 是一个新闻应用。如果我们希望从新闻应用 B 中打开邮件应用 A 的某个特定。,并将其放入一个独立的任务栈中,以便用户可以在不同的任务栈中分别处理邮件和阅读新闻,就可以通过设置合适的。的启动行为提供了更精细的控制,有助于创建更符合用户体验和应用逻辑的交互流程。会按照启动顺序依次压入当前应用的任务栈中。可能会被放入不同的任务栈,从而实现更灵活的任务管理。)一起使用,才能达到预期的效果。例如,如果应用 A 中的。所属的任务栈的亲和性。相同的任务栈中创建。原创 2024-08-15 15:26:49 · 480 阅读 · 0 评论 -
讲讲android art虚拟机的内存
例如,如果应用中存在大量的图片资源,需要及时回收不再使用的图片对象,以避免内存泄漏和内存溢出。或者,对于频繁创建和销毁的小对象,可以考虑使用对象池来复用对象,减少内存分配和垃圾回收的开销。假设一个在线视频播放应用,在缓存视频数据时,如果不注意内存限制和及时释放不再使用的缓存数据,可能会导致内存占用过高,影响系统性能甚至导致应用崩溃。:常用于新生代的垃圾回收,将存活的对象复制到另一个 Survivor 区,然后清理原来的区域。:适用于老年代,先标记出存活的对象,然后清除未标记的对象。原创 2024-08-15 14:54:06 · 506 阅读 · 0 评论 -
Android系统是如何管理activity的
当启动一个新的 Activity 时,它会被放置在任务栈的顶部。当用户按返回键时,位于栈顶的 Activity 会被销毁,下一个 Activity 会显示出来。它根据系统的资源情况、用户操作以及应用的行为来决定 Activity 的创建、暂停、恢复和销毁。总之,Android 系统通过任务栈和活动管理器的协同工作,有效地管理 Activity 的状态和生命周期,以提供流畅和高效的用户体验。在 Activity 的生命周期中,系统会通过一系列回调方法来通知开发者 Activity 的状态变化,如。原创 2024-08-15 14:30:51 · 527 阅读 · 0 评论 -
说一下ServiceConnection
借助 Binder 机制实现了客户端与服务端的可靠连接和交互,使得不同组件能够协同工作,提升了应用的架构灵活性和功能扩展性。方法绑定一个服务时,系统会在内部创建与服务所在进程的通信通道。通过 Binder 驱动,客户端和服务端可以进行双向的通信。服务端实现具体的逻辑,并通过 Binder 将操作结果返回给客户端。其底层原理主要涉及到 Android 的进程间通信(IPC)机制,特别是 Binder 机制。机制负责数据的序列化和反序列化,确保通信的高效和安全。例如,假设有一个音乐播放服务,客户端通过。原创 2024-08-15 14:17:56 · 528 阅读 · 0 评论 -
Intent底层的通信是binder吗?
然而,当涉及到跨进程通信(IPC,Inter-Process Communication)时,例如不同应用之间通过 Intent 传递信息,底层通常是基于 Binder 机制来实现的。例如,当一个应用通过 Intent 启动另一个应用的组件时,如果这两个应用运行在不同的进程中,系统会使用 Binder 机制来在进程间传递 Intent 及相关的数据。Binder 是 Android 中一种高效的进程间通信机制,它提供了一种安全、高效的方式在不同进程之间传递数据和调用方法。原创 2024-08-15 13:59:21 · 293 阅读 · 0 评论 -
onSaveInstanceState方法里面的PersistableBundle和Bundle两个参数有啥区别
onSaveInstanceState方法里面的PersistableBundle和Bundle两个参数有啥区别。例如,如果您的应用中有一些用户设置或关键状态信息,希望在系统升级后仍然能够保留,可能更适合使用。运行期间的临时状态,如当前页面滚动位置、用户的临时输入等,使用。总的来说,根据具体的需求和数据的重要性及持久化要求,来选择使用。原创 2024-08-15 13:49:12 · 277 阅读 · 0 评论 -
为啥说Activity里面的onSaveInstanceState方法的bundle参数不可能为空
为啥说Activity里面的onSaveInstanceState方法的bundle参数不可能为空。面临可能被销毁并需要恢复状态的情况(如配置更改,如屏幕旋转,或者系统资源紧张导致。的状态,这将导致应用的用户体验受损,例如用户输入的数据丢失、页面布局重置等问题。对象,以便开发者能够将需要保存的状态数据放入其中。参数获取之前保存的状态,从而恢复到之前的状态。参数为空,那么就无法有效地保存和恢复。方法,并传递一个可用的。在 Android 中,例如,如果屏幕发生旋转,状态的有效保存和恢复,原创 2024-08-15 12:27:51 · 243 阅读 · 0 评论 -
说说CopyOnWriteArrayList
其原理主要是:当对列表进行修改操作(如添加、删除、更新元素)时,它不是直接在原有的数组上进行修改,而是先复制一个新的数组,在新数组上进行修改操作,修改完成后将原有的引用指向新的数组。这种方式的优点在于:读操作不加锁,因此读操作的性能很高。因为多个线程并发读时,不会因为有写操作而被阻塞。在实际应用中, CopyOnWriteArrayList 适用于读多写少且对数据一致性要求不高的场景。2. 数据一致性问题,由于读操作可能读取到旧的数据,所以不能保证实时的强一致性。原创 2024-08-14 06:38:34 · 191 阅读 · 0 评论 -
说一下Matrix
需注意,确保按照实际情况配置相关文件路径和参数,并根据项目的特定需求选择合适的插件和功能。同时,随着 Matrix 版本的更新,可能会有一些细节上的变化,建议参考最新的官方文档和项目示例进行集成和使用。总之,Matrix 为 Android 开发者提供了强大的性能监控和优化工具,有助于提升应用的质量和用户体验。不同的插件具有不同的功能和使用方式,具体的使用细节可以参考 Matrix 的官方文档和相关示例。通常需要在项目中引入相关的依赖,进行配置和初始化,然后就可以在应用运行过程中收集性能数据。原创 2024-08-13 16:41:41 · 840 阅读 · 0 评论 -
IdleHandler 不可以执行耗时操作的原因
是 Android 消息机制中的一部分,通常用于在消息队列空闲时执行一些额外的处理逻辑。为了保证应用的流畅性和稳定性,耗时操作应该放在后台线程中进行,例如使用。原创 2024-08-13 16:11:38 · 285 阅读 · 0 评论 -
说一下Android中的IdleHandler
是 Android 中的一个接口,常用于在主线程空闲时执行一些低优先级的任务。它提供了一种在主线程空闲时执行额外操作的机制,能够优化应用的性能和资源利用。当主线程没有其他任务需要处理,处于空闲状态时,系统会调用已注册的。,表示希望继续留在空闲队列中等待下一次空闲时再次被调用;时,需要注意不要执行耗时操作,以免影响主线程的响应性能。,则会从空闲队列中移除。原创 2024-08-13 16:04:52 · 487 阅读 · 0 评论 -
Android如何做主线程卡顿监控
Android如何做主线程卡顿监控原创 2024-08-13 14:12:53 · 704 阅读 · 0 评论 -
ThreadLocal如何实现线程隔离的。
当一个线程调用 ThreadLocal 的 set 方法设置值时,实际上是将值存储在当前线程的 ThreadLocalMap 中。每个线程的 ThreadLocalMap 相互独立,因此不同线程在操作 ThreadLocal 时,实际上是在操作各自线程内部的 ThreadLocalMap ,从而实现了线程之间数据的隔离。在实现细节上, ThreadLocalMap 中的键是 ThreadLocal 对象的弱引用,而值是用户设置的实际对象。原创 2024-08-13 13:57:45 · 199 阅读 · 0 评论 -
Android如何获取设备的屏幕刷新率
可以通过getRefreshRate的方法获取屏幕的刷新率。Android如何获取设备的屏幕刷新率。原创 2024-08-13 13:42:16 · 457 阅读 · 0 评论 -
android log能在release包里面打印吗
在 build.gradle 文件中,设置 buildTypes 的 release 下的 debuggable 为 true,这样就可以在 release 模式下查看 logcat 的日志。但是这样会影响安全性和性能,所以不建议在正式发布的应用中使用。 在 proguard-rules.pro 文件中,添加 -assumenosideeffects class android.util.Log 的规则,这样就可以在 release 模式下删除 log 的代码,避免泄露敏感信息。这种方法需要开启混淆和优化原创 2023-11-09 19:46:46 · 1104 阅读 · 0 评论 -
DiffUtil的使用
当调用这个方法时,我们会创建一个新的DiffCallback对象,然后使用calculateDiff()方法计算旧数据集和新数据集之间的差异。RecyclerView的DiffUtil用于计算并更新RecyclerView中数据集的变化。通过使用DiffUtil,我们可以避免完全重新加载整个列表,并且只会更改必要的视图。总之,DiffUtil是一个非常有用的工具,可以帮助我们更高效地更新RecyclerView中的数据集。在上面的例子中,我们首先定义了一个自定义的适配器MyAdapter,并实现了一个。原创 2023-04-28 14:26:47 · 1366 阅读 · 0 评论 -
Android 通过MediaMetadataRetriever获取视频封面和时长
【代码】Android 通过MediaMetadataRetriever获取视频封面和时长。原创 2022-10-09 22:32:22 · 1458 阅读 · 1 评论 -
Android:获取相册视频、图片缩略图
class ThumbnailUtil { companion object { fun getPictureThumbnail( context: Context?, fileId: Long?, fileUri: Uri?, size: Size, ): Bitmap? { if (context == null) return null return.原创 2021-11-05 17:39:05 · 1634 阅读 · 0 评论 -
RecyclerView的缓存获取机制
# RecyclerView的缓存获取机制RecyclerView是我们开发中接触比较多的控件。官方给他的定义是"A flexible view for providing a limited window into a large data set."定义中有个large data 很是醒目,那RecyclerView怎么处理大量的数据,而不oom和卡顿呢?这就是RecyclerView里面的缓存机制,首先我们看一下几个基本概念:- Binding: 子视图显示adapter中与其对应位置的.原创 2021-09-06 16:02:22 · 720 阅读 · 0 评论 -
FragmentContainerView详解
FragmentContainerView 位于androidx.fragment.app包下面,是专门为Fragment设计的自定义布局。它扩展了FrameLayout,所以它可以可靠地处理Fragment事务,并且它还有其他功能来协调Fragment行为。FragmentContainerView应该被用作fragment的容器,通常在一个activity的xml布局中设置,例如: <androidx.fragment.app.FragmentContainerView xm原创 2021-05-15 14:57:41 · 24631 阅读 · 3 评论 -
AsyncTask报RejectedExecutionException异常原因分析以及解决方案。
AsyncTask的线程池的排队队列的容量是128。一个AsyncTask执行队列中的任务满了,会报RejectedExecutionException异常,如下代码。 for (int i = 0; i <= 10000; i++) { final int finalI = i; ...原创 2019-01-03 18:43:24 · 1894 阅读 · 0 评论