博客
关于我
Android 面试题(二)Android基础篇
阅读量:638 次
发布时间:2019-03-14

本文共 3157 字,大约阅读时间需要 10 分钟。

Android基础篇

APP启动方式

点击应用图标后,系统会启动LauncherActivity。如果这个进程已存在,系统会直接重启该进程;如果进程不存在,就会通知Zygote进程通过Socket fork新进程,之后会通过 Binder 机制通知新进程创建完成。整个流程属于Activity的启动流程。

Activity启动模式

Android提供了四种Activity启动模式,根据需要选择合适的模式:

  • 标准模式 (standard)

    默认模式,无需手动配置,默认创建新实例,允许多个实例并叠加运行。

  • 单实例 (singleTop)

    允许多个实例,但不支持重叠启动。同一应用启动该Activity时,会调用onNewIntent方法而不是创建新实例。

  • 单栈单实例 (singleTask)

    一个实例只能在应用程序的栈中运行。如果在其它任务中启动该Activity时,会销毁栈中其他Activity,仅将该Activity的onNewIntent调用的情况下的新任务。

  • 独立实例 (singleInstance)

    在同一个应用程序中只能运行一个实例,并且这个实例独立运行在一个任务中,不允许其他Activity存在。

  • 横竖屏切换

    横竖屏切换会根据Android版本不同触发不同的生命周期:

  • 未设置Activity配置

    切屏时会多次调用生命周期,横屏切换一次,竖屏切换两次,具体流程如下:

    • onSaveInstanceState
    • onPause
    • onStop
    • onDestroy
    • onCreate
    • onStart
    • onRestoreInstanceState
    • onResume
  • 设置orientation配置

    切屏仍会调用完整生命周期,但切屏时仅一次调用:

    • onSaveInstanceState
    • onPause
    • onStop
    • onDestroy
    • onCreate
    • onStart
    • onRestoreInstanceState
    • onResume
  • 设置orientation|keyboardHidden配置

    切屏只会调用onConfigurationChanged方法。

  • PathClassLoader与DexClassLoader

    PathClassLoader与DexClassLoader的主要区别在于类文件的查找路径:

  • PathClassLoader

    只能加载系统中安装的APK文件,只能在data/data目录下的文件。

  • DexClassLoader

    支持加载任意路径下的 dex、jar、apk、zip 文件,可以用于自定义类加载场景。

  • Intent传递数据大小

    Intent在Android中默认支持1MB的数据大小。如果需要传递大数据量,可以通过以下方式解决:

  • 进程内:采用EventBus或文件缓存等方式。
  • 进程间:通过ContentProvider进行进程间数据共享和传递。
  • 注意:不要直接通过Intent传递大数据,否则可能导致OOM。

    Context相关类

    Context在Android中的实现和包装:

  • Context抽象类

    提供与资源、注解等操作相关的API。

  • ContextImpl

    Context的实际实现类。

  • ContextWrapper

    包装类,内部使用ContextImpl实现。Activity、Service等组件间接或直接继承自ContextWrapper。

  • IntentService与Service

    IntentService和Service的主要区别:

  • Service

    不是独立的进程,依赖主线程执行。如果在Service中执行长时间逻辑或操作,可能导致ANR。

  • IntentService

    IntentService是Service的子类,创建时会启动一个内部线程执行耗时操作。通过Handler实现多线程管理,不会引起ANR。

  • Service启动方式

    Service的启动方式及其区别:

  • startService

    onCreate → onStartCommand → onDestroy。服务与启动者的销毁无关,除非主动调用停止方法。

  • bindService

    onCreate → onBind → onDestroy。服务与启动者相互依赖,启动者销毁则服务也会销毁。

  • 结合startService和bindService

    可以避免服务因主进程销毁而被销毁。

  • BroadcastReceiver类型

    Android中的 BroadcastReceiver类型有三种:

  • 有序广播 (OrderedBroadcastReceiver)

    广播接收器按照优先级接收广播,可终止广播和修改数据。

  • 无序广播 (BroadcastReceiver)

    广播接收器不会接收到发送后续广播的数据,无法终止和修改。

  • 粘性广播 (stickyBroadcast)

    广播会被长时间保留,并传递给新的收件人。通过sendStickyBroadcast发送。

  • 进程类型与线程

    进程与线程在Android中的区别和作用:

  • 进程

    资源管理的基本单位,对CPU、内存等资源拥有完整控制。

  • 线程

    计算机执行的基本单位,占用资源更轻薄,调度更灵活。每个线程在进程中独立运行。

  • 线程是进程控制的核心,进程管理资源,线程负责具体执行指令。

    线程亦分为用户级和内核级,前者需绑定内核级线程,用户级线程无法保证执行顺序。

    Thread与进程间通信

    Thread在Android中的应用:

  • 主要方式
    默认线程由Thread.start()启动,内部调度方式因系统而异。
  • 线程间通信
    通过共享内存、Pipe、 Monsanto机制实现。常通过Runable实现异步执行。
  • 进程间通信

    进程间的高效通信方式:

  • Bundle

    通过Intent携带数据传递,适合简单数据。

  • ContentProvider

    多个应用间共享数据,便于管理,兼顾数据安全。

  • AIDL

    定义接口,实现远程服务调用,便于复杂场景。

  • BroadCast

    系统广播或自定义广播,可传递简单信息。

  • Socket

    通过网络方式实现跨进程通信,适合大型数据传输。

  • 进程保活

    提高进程稳定性的关键措施:

  • 优化进程组

    提升进程优先级,降低被杀死的风险。

  • 进程拉活

    采用广播机制,如开机广播或锁屏广播。

  • 优化资源管理

    合理使用资源,减少内存泄漏。

  • 序列化与反序列化

    序列化与反序列化的具体操作内容:

    序列化(Serialize)将数据转为二进制流,反序列化则将其还原为原数据结构。

    主要方法包括:

  • ** Serializable**

    基于Java的默认序列化机制,效率较低,适合存储磁盘等介质。

  • Parcelable

    Android自定义的序列化机制,效率更高,适合对象间传递。

  • Dex问题与解决方案

    解决65536(64k)的类、方法索引问题,避免Dex文件溢出:

  • 问题根源

    使用short存储类、方法索引,超过范围会导致溢出。

  • 解决方案

    使用Multidex,通过多dex文件实现类、方法存储的扩展。

  • anim标记

    提供三种主要动画效果:

  • 帧动画 (FrameAnimation)

    按帧播放图片序列,合成动画效果。

  • 补间动画 (Tween Animation)

    通过属性变换实现动画效果,常见属性包括scale、alpha、Translate、Rotate。

  • 属性动画 (Property Animation)

    持续修改View属性,实现动画效果。

  • 通过属性动画可以真实地改变View属性,带来更生动的效果。

    synopsis

    以上内容涵盖了Android基础组件的核心知识点,详细解析了关键技术原理和应用场景,适合初级开发者和技术爱好者深入学习和实践。

    转载地址:http://hwilz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>