本文共 3157 字,大约阅读时间需要 10 分钟。
点击应用图标后,系统会启动LauncherActivity。如果这个进程已存在,系统会直接重启该进程;如果进程不存在,就会通知Zygote进程通过Socket fork新进程,之后会通过 Binder 机制通知新进程创建完成。整个流程属于Activity的启动流程。
Android提供了四种Activity启动模式,根据需要选择合适的模式:
标准模式 (standard)
默认模式,无需手动配置,默认创建新实例,允许多个实例并叠加运行。单实例 (singleTop)
允许多个实例,但不支持重叠启动。同一应用启动该Activity时,会调用onNewIntent方法而不是创建新实例。单栈单实例 (singleTask)
一个实例只能在应用程序的栈中运行。如果在其它任务中启动该Activity时,会销毁栈中其他Activity,仅将该Activity的onNewIntent调用的情况下的新任务。独立实例 (singleInstance)
在同一个应用程序中只能运行一个实例,并且这个实例独立运行在一个任务中,不允许其他Activity存在。横竖屏切换会根据Android版本不同触发不同的生命周期:
未设置Activity配置
切屏时会多次调用生命周期,横屏切换一次,竖屏切换两次,具体流程如下:设置orientation配置
切屏仍会调用完整生命周期,但切屏时仅一次调用:设置orientation|keyboardHidden配置
切屏只会调用onConfigurationChanged方法。PathClassLoader与DexClassLoader的主要区别在于类文件的查找路径:
PathClassLoader
只能加载系统中安装的APK文件,只能在data/data目录下的文件。DexClassLoader
支持加载任意路径下的 dex、jar、apk、zip 文件,可以用于自定义类加载场景。Intent在Android中默认支持1MB的数据大小。如果需要传递大数据量,可以通过以下方式解决:
注意:不要直接通过Intent传递大数据,否则可能导致OOM。
Context在Android中的实现和包装:
Context抽象类
提供与资源、注解等操作相关的API。ContextImpl
Context的实际实现类。ContextWrapper
包装类,内部使用ContextImpl实现。Activity、Service等组件间接或直接继承自ContextWrapper。IntentService和Service的主要区别:
Service
不是独立的进程,依赖主线程执行。如果在Service中执行长时间逻辑或操作,可能导致ANR。IntentService
IntentService是Service的子类,创建时会启动一个内部线程执行耗时操作。通过Handler实现多线程管理,不会引起ANR。Service的启动方式及其区别:
startService
onCreate → onStartCommand → onDestroy。服务与启动者的销毁无关,除非主动调用停止方法。bindService
onCreate → onBind → onDestroy。服务与启动者相互依赖,启动者销毁则服务也会销毁。结合startService和bindService
可以避免服务因主进程销毁而被销毁。Android中的 BroadcastReceiver类型有三种:
有序广播 (OrderedBroadcastReceiver)
广播接收器按照优先级接收广播,可终止广播和修改数据。无序广播 (BroadcastReceiver)
广播接收器不会接收到发送后续广播的数据,无法终止和修改。粘性广播 (stickyBroadcast)
广播会被长时间保留,并传递给新的收件人。通过sendStickyBroadcast发送。进程与线程在Android中的区别和作用:
进程
资源管理的基本单位,对CPU、内存等资源拥有完整控制。线程
计算机执行的基本单位,占用资源更轻薄,调度更灵活。每个线程在进程中独立运行。线程是进程控制的核心,进程管理资源,线程负责具体执行指令。
线程亦分为用户级和内核级,前者需绑定内核级线程,用户级线程无法保证执行顺序。
Thread在Android中的应用:
进程间的高效通信方式:
Bundle
通过Intent携带数据传递,适合简单数据。ContentProvider
多个应用间共享数据,便于管理,兼顾数据安全。AIDL
定义接口,实现远程服务调用,便于复杂场景。BroadCast
系统广播或自定义广播,可传递简单信息。Socket
通过网络方式实现跨进程通信,适合大型数据传输。提高进程稳定性的关键措施:
优化进程组
提升进程优先级,降低被杀死的风险。进程拉活
采用广播机制,如开机广播或锁屏广播。优化资源管理
合理使用资源,减少内存泄漏。序列化与反序列化的具体操作内容:
序列化(Serialize)将数据转为二进制流,反序列化则将其还原为原数据结构。
主要方法包括:
** Serializable**
基于Java的默认序列化机制,效率较低,适合存储磁盘等介质。Parcelable
Android自定义的序列化机制,效率更高,适合对象间传递。解决65536(64k)的类、方法索引问题,避免Dex文件溢出:
问题根源
使用short存储类、方法索引,超过范围会导致溢出。解决方案
使用Multidex,通过多dex文件实现类、方法存储的扩展。提供三种主要动画效果:
帧动画 (FrameAnimation)
按帧播放图片序列,合成动画效果。补间动画 (Tween Animation)
通过属性变换实现动画效果,常见属性包括scale、alpha、Translate、Rotate。属性动画 (Property Animation)
持续修改View属性,实现动画效果。通过属性动画可以真实地改变View属性,带来更生动的效果。
以上内容涵盖了Android基础组件的核心知识点,详细解析了关键技术原理和应用场景,适合初级开发者和技术爱好者深入学习和实践。
转载地址:http://hwilz.baihongyu.com/