【安卓计时系统源码】【抖音定位源码】【书签购物源码模式】parcelable源码解析

时间:2024-12-28 10:32:30 来源:lol无限视距源码 分类:焦点

1.compileDebugKotlin FAILED和aidl
2.Android进程间通信之bindService篇
3.Activity的基础知识(下)
4.腾讯T9级大神也在学的源码《Android Framework精编内核手册》(附Framework面试题)

parcelable源码解析

compileDebugKotlin FAILED和aidl

        自从入职CS,项目编译一直有个神坑报错,每次都需要clean rebuild若干次, 非常耽误时间

        简单的说, 如果在使用AIDL时需要一个自定义的数据类型, 我们一般会这么写:

        当我们写一个子类SubClass继承该类.然后在Kotlin文件中直接或者间接引用到SubClass时, 就会出现一个以下的报错

        报错发生在 app:compileDebugKotlin , 也就是kotlinc. 但是我们明明已经定义了该类. 全局搜索发现有两个 CustomParcel.java, 推测是两个同名的文件引起.

        除了我们自己写的Java文件, 另外一个肯定是aidl生成的. 引用一张图:

        在编译开始时会把aidl转化为Java文件, 接下来才会经过javac, kotlinc把JVM语言文件转化为字节码 .class 文件.

        查看aidl生成的文件, 发现是空的, 并且有一行注释: 说明这是一个 PlaceHolder, 也就是占位文件.

        网上搜到有人遇到了 相同的问题 ,问题确实发生在kotlinC编译器以aidl生成的空java文件为编译目标, 而不是真正的java类文件. 并且也给出了解决办法,升级buildTools版本.

        查看 buildTools提交记录

        提交记录: No java output for parcelable declaration. 也就是移除了以下的为自定义的aidl Parcelable类生成Java文件的设定(.0.2之前的实现)

        升级.0.3, 再次编译, 发现build/aidl目录下不再生成同名的 PlaceHolder文件了, 只剩下唯一的我们自己的文件, kotlinC这次只能用唯一的文件来编译,报错解决.

        至于为什么有时候clean rebuild能编译成功,需要探究下kotlinC的源码.

        最坑的是, .0.2就是 gradle plugin4.1默认支持的版本 , 所以你不手动指定buildTools版本为.0.3以上就会掉进坑里.

Android进程间通信之bindService篇

       在Android的进程间通信中,binder是解析一种核心机制,广泛应用于四大组件之一的源码Service。本文专注于使用Service与binder结合的解析bindservice通信方式,探讨其实现方法与关键特性。源码

       创建Service作为服务端,解析安卓计时系统源码其主要功能是源码向客户端提供接口。创建Service的解析方式包括扩展binder类、使用Messenger和AIDL。源码扩展binder类适用于服务端与客户端在同进程场景,解析不具备跨进程能力,源码因此这里不详细说明。解析使用Messenger能实现跨进程通信,源码特点是解析请求放入队列,服务端无需线程安全设计,源码但在实际项目中使用较少。

       AIDL(Android Interface Definition Language)是一种便捷实现跨进程通信的工具。它支持客户端并发访问,要求服务端实现线程安全设计。创建.aidl文件定义接口,服务端和客户端均需包含源码。抖音定位源码实现AIDL接口的实例在onBind()接口返回给客户端,使得客户端能调用接口。

       使用AIDL的关键技术点在于通过IPC调用传递对象。支持Java语言原语类型、String、CharSequence、List和Map等数据类型传递。对于自定义对象,必须实现Parcelable接口,以完成序列化。书签购物源码模式在Android 及以上版本中,可直接定义Parcelable对象。AIDL工具在编译时协助生成序列化代码。

       在方法中使用Bundle参数时,需在解析前显式设置ClassLoader。这样能确保Bundle中对象正确加载。

       本文总结了使用binder和bindservice实现Java端与Java端跨进程通信的方式,并简单概述了AIDL工具的关键技术点。使用bindservice结合AIDL,能在多个场景下有效实现Java应用之间的完整的商城源码高效通信。

Activity的基础知识(下)

       ä¸Šç¯‡æ€»ç»“了Activity的一些知识,现在继续对Activity的知识进行梳理,包括Activity直接传递数据,Activity的生命周期,Activity的启动模式等.

        1.intent传递数据:

        使用startActivity方法,intent的putExtra()方法,以键值对的形式传递数据,该方法有很多重载方法,可以根据传递数据的不同类型选择合适的方法.除了有putExtra()方法外,还有putExtras()方法,传递的参数是Bundle.

        如果传递的是对象,这个对象要实现序列化,也就是实现Parcelable或者Serializable接口.

        如果希望被启动的页面返回数据,需要使用startActivityForResult()方法,这个方法中需要设置访问号,用来区分不同的访问者.并且在启动页重写onActivityResult方法用来接收返回的数据,

        2.两种情况下的Activity的生命周期.

        正常情况下的生命周期,正常情况是指用户的正常操作下的Activity的生命周期.后面会分析异常情况下的生命周期.

        onCreate: Activity第一次创建时候的回调,主要是在这个方法进行初始化工作,比如初始化控件和事件绑定工作.

        onStart:Activity从不可见状态变成可见状态.

        onResume:Activity变成前台,可以和用户交互.

        onPause:Activity可见但是不能和用户交互.

        onStop:Activity从可见变得不可见,成为后台Activity.

        onDestroy:Activity销毁时调用.

        onRestart:Activity从后台变成前台Activity.

        在启动Activity和两个Activity之间跳转时,可以知道Activity的生命周期变化过程,有两个说明:(1)在两个Activity跳转时,第一个Activty的onPause,onStop方法和第二个Activity的生命周期方法调用时机.

        第一个Activity先执行onPause方法,第二个Activity才能创建.这也就意味着在onPause方法中不能执行太耗时的操作,否则会影响第二个Activity的创建.在源码(ActivityStack)中有这样的注释:

        (2)onStart和onResume,onPause和onStop这两对方法的实质不同处:onStart和onStop这两个方法是从Activity的可见性来区分的,onResume和onPause是从Activity是否处于前台,是否可以和用户交互来区分的,注意在onPause调用时Activity还是可见的,调用时机比如弹出dialog时,下面的Activity是可见的.这个时候调用的是onPause方法.

        异常情况下Activity的生命周期:异常情况下是指资源相关配置发生变化或后台Activity被系统回收时Activity的生命周期.后台Activity被系统回收的情况比较难复现,在资源相关配置发生变化时和后台Activity被回收时的生命周期执行过程是一样的,比较容易复现的就是横竖屏切换时的生命周期执行过程.在 AndroidManifest的Activity组件下配置android:screenOrientation标签,当设置可以横竖方向随着方向感应器来调节时,在切换时会出现先销毁Activity再创建的过程.

        过程:

        在这种情况下有可能会有数据的丢失,系统提供用来保存数据和还原数据的方法:onSaveInstanceState和onRestoreInstanceState.用方法参数Bundle可以保存和还原数据.

        可以根据需要设置android:screenOrientation标签,设定activity的方向,如果activity的方向是需要横竖屏切换,但是不容许销毁Activity,可以设置如下标签,当这些情况(常用的)发生变化是不会重新走Activity的生命周期方法,只会调用onConfigurationChanged,可以根据情况在这个方法里更新操作.

        切换时的log输出

        3.Activity的四种启动模式

        标准:是Activity的默认启动模式,对于AndroidManifest的Activity节点下的android:launchMode="standard"标签.

        特定:每次启动都会重新创建新的Activity.

        singleTop:对应的AndroidManifes的Activity节点下的android:launchMode="singleTop"标签

        特点:当此模式的Activity处于栈顶时,不会重新创建新的Activity,会调用onNewIntent方法,如果更新Activity的intent,需要调用 setIntent()方法,具体的生命周期过程

        singleTask:在activity栈中已经有需要再启动的activity时,会先清除位于需要启动activity之上的activity,例如:启动顺序mainActivity-activityA -activityB-activityA,其中activityA是singleTask的启动模式:

        singleInstance:在一个栈中单独存在的activity.

        关于activity栈:是指用来管理activity一种"先进先出"的队列结构,查看activity对应栈的方法:Activity的getTaskId()方法,同一个栈的id值是相同的.adb shell dumpsys activity在终端查看栈结构,比如还是上面的activity启动顺序,不同是ActivityA这是设置成singleInstance,这是的栈结构:有两个TaskRecord,其中ActivityB和MainActivity位于同一个栈中.

        4.Activity开发中使用技巧:

        <1>定义一个父Activity,在创建新的Activity时继承这个activity即可,将一些activity的公共设置可以设置在父activity中,比如获取每个Activity的名字,设置activity的窗体属性,同一管理activity的生命周期等,

        <2>在启动的activity中定义静态方法,启动条件会显而易见:

        <3>管理activityç±»,用来一键退出app.在父类Activity的创建和销毁时用来添加和移除Activity,在需要一键退出的地方调用静态finishAllActivity方法.

腾讯T9级大神也在学的《Android Framework精编内核手册》(附Framework面试题)

       Android开发者在Framework层维护开发时,通常会经历五个阶段。切记,不可因自满而停滞不前,避免陷入技术瓶颈。

       如今,行业对开发者的要求日益提高,大厂面试中的问题技术难度普遍增加。看似基础的问题,通过网上查阅资料或许能解决,snmp自动拓扑源码但面试官会根据你的回答进行深入挖掘。若对技术原理和底层逻辑掌握不足,应对这类问题将有一定难度。

       腾讯T9级大神分享的《Android Framework精编内核手册》是专为这一需求设计的学习资源。该手册不仅涵盖了底层原理、源码解析等核心技术点,还深入探讨了普通开发者难以触及的复杂系统问题设计方案。通过学习并整理此手册,开发者可显著提升自己的技能水平。

       该手册包含以下章节:深入解析Binder、深入解析Handler消息机制、Dalvik VM进程系统、深入解析WMS、PackageMS启动、AMS面试专题。每章节都旨在提供全面、深入的框架知识,为开发者提供坚实的基础。

       此外,《Android Framework高频面试题总结》也提供了帮助,其中包括了AMS、PMS、Activity启动流程、App启动流程、Binder机制(IPC、AIDL的使用)、为什么使用Parcelable、Android图像显示相关流程、Vsync信号等关键知识点。这份总结为开发者准备大厂面试提供了宝贵的资源。

       尽管资料内容丰富,这里仅展示部分内容截图。有需要的伙伴可通过文末卡片获取完整资源。

       掌握底层原理并能触类旁通是大厂所需的关键技能。通过学习这份资料,开发者将能够显著提升自己的Framework技能,加速成为高级Android开发者的过程。

       最后,祝愿每位开发者都能在职业生涯中取得成功,实现个人目标。希望这份资料能为你的旅程提供宝贵的支持和帮助。