android基础知识题,史上最全的Android面试题集锦

2023-11-15

Android基本知识点

1、常规知识点

1、 Android类加载器

在Android开发中,不管是插件化还是组件化,都是基于Android系统的类加载器ClassLoader来设计的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并、优化,然后再生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,在早期的Android应用开发中,如果不对Android应用进行分dex处理,那么最后一个应用的apk只会有一个dex文件。

Android中常用的类加载器有两种,DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader。区别在于调用父类构造器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录必须是内部存储路径,用来缓存系统创建的Dex文件。而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以我们可以用DexClassLoader去加载外部的apk文件,这也是很多插件化技术的基础。

46af4f1233b1d3f622a2f3e40640a58a.png

2、 Service

理解Android的Service,可以从以下几个方面来理解:

Service是在main Thread中执行,Service中不能执行耗时操作(网络请求,拷贝数据库,大文件)。

可以在xml中设置Service所在的进程,让Service在另外的进程中执行。

Service执行的操作最多是20s,BroadcastReceiver是10s,Activity是5s。

Activity通过bindService(Intent,ServiceConnection,flag)与Service绑定。

Activity可以通过startService和bindService启动Service。

IntentService

IntentService是一个抽象类,继承自Service,内部存在一个ServiceHandler(Handler)和HandlerThread(Thread)。IntentService是处理异步请求的一个类,在IntentService中有一个工作线程(HandlerThread)来处理耗时操作,启动IntentService的方式和普通的一样,不过当执行完任务之后,IntentService会自动停止。另外可以多次启动IntentService,每一个耗时操作都会以工作队列的形式在IntentService的onHandleIntent回调中执行,并且每次执行一个工作线程。IntentService的本质是:封装了一个HandlerThread和Handler的异步框架。

2.1、生命周期示意图

Service 作为 Android四大组件之一,应用非常广泛。和Activity一样,Service 也有一系列的生命周期回调函数,具体如下图。

bc236d4b065e2e0888faaf7219e084c8.png

通常,启动Service有两种方式,startService和bindService方式。

2.2、startService生命周期

当我们通过调用了Context的startService方法后,我们便启动了Service,通过startService方法启动的Service会一直无限期地运行下去,只有在外部调用Context的stopService或Service内部调用Service的stopSelf方法时,该Service才会停止运行并销毁。

onCreate

onCreate: 执行startService方法时,如果Service没有运行的时候会创建该Service并执行Service的onCreate回调方法;如果Service已经处于运行中,那么执行startService方法不会执行Service的onCreate方法。也就是说如果多次执行了Context的startService方法启动Service,Service方法的onCreate方法只会在第一次创建Service的时候调用一次,以后均不会再次调用。我们可以在onCreate方法中完成一些Service初始化相关的操作。

onStartCommand

onStartCommand: 在执行了startService方法之后,有可能会调用Service的onCreate方法,在这之后一定会执行Service的onStartCommand回调方法。也就是说,如果多次执行了Context的startService方法,那么Service的onStartCommand方法也会相应的多次调用。onStartCommand方法很重要,我们在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。

当Android面临内存匮乏的时候,可能会销毁掉你当前运行的Service,然后待内存充足的时候可以重新创建Service,Service被Android系统强制销毁并再次重建的行为依赖于Service中onStartCommand方法的返回值。我们常用的返回值有三种值,START_NOT_STICKY、START_STICKY和START_REDELIVER_INTENT,这三个值都是Service中的静态常量。

START_NOT_STICKY

如果返回START_NOT_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service,当然如果在其被杀掉之后一段时间又调用了startService,那么该Service又将被实例化。那什么情境下返回该值比较恰当呢?如果我们某个Service执行的工作被中断几次无关紧要或者对Android内存紧张的情况下需要被杀掉且不会立即重新创建这种行为也可接受,那么我们便可将 onStartCommand的返回值设置为START_NOT_STICKY。举个例子,某个Service需要定时从服务器获取最新数据:通过一个定时器每隔指定的N分钟让定时器启动Service去获取服务端的最新数据。当执行到Service的onStartCommand时,在该方法内再规划一个N分钟后的定时器用于再次启动该Service并开辟一个新的线程去执行网络操作。假设Service在从服务器获取最新数据的过程中被Android系统强制杀掉,Service不会再重新创建,这也没关系,因为再过N分钟定时器就会再次启动该Service并重新获取数据。

START_STICKY

如果返回START_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象,然后Android系统会尝试再次重新创建该Service,并执行onStartCommand回调方法,但是onStartCommand回调方法的Intent参数为null,也就是onStartCommand方法虽然会执行但是获取不到intent信息。如果你的Service可以在任意时刻运行或结束都没什么问题,而且不需要intent信息,那么就可以在onStartCommand方法中返回START_STICKY,比如一个用来播放背景音乐功能的Service就适合返回该值。

START_REDELIVER_INTENT

如果返回START_REDELIVER_INTENT,表示Service运行的进程被Android系统强制杀掉之后,与返回START_STICKY的情况类似,Android系统会将再次重新创建该Service,并执行onStartCommand回调方法,但是不同的是,Android系统会再次将Service在被杀掉之前最后一次传入onStartCommand方法中的Intent再次保留下来并再次传入到重新创建后的Service的onStartCommand方法中,这样我们就能读取到intent参数。只要返回START_REDELIVER_INTENT,那么onStartCommand重的intent一定不是null。如果我们的Service需要依赖具体的Intent才能运行(需要从Intent中读取相关数据信息等),并且在强制销毁后有必要重新创建运行,那么这样的Service就适合返回START_REDELIVER_INTENT。

onBind

Service中的onBind方法是抽象方法,所以Service类本身就是抽象类,也就是onBind方法是必须重写的,即使我们用不到。在通过startService使用Service时,我们在重写onBind方法时,只需要将其返回null即可。onBind方法主要是用于给bindService方法调用Service时才会使用到。

onDestroy

onDestroy: 通过startService方法启动的Service会无限期运行,只有当调用了Context的stopService或在Service内部调用stopSelf方法时,Service才会停止运行并销毁,在销毁的时候会执行Service回调函数。

2.3、bindService生命周期

1f0fc649b66751320cacf129585a43a3.png

bindService方式启动Service主要有以下几个生命周期函数:

onCreate():

首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次。

onStartCommand():

当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。

onDestroy():

当服务不再使用且将被销毁时,系统将调用此方法。

onBind():

当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法。

onUnbind():

当另一个组件通过调用unbindService()与服务解绑时,系统将调用此方法。

onRebind():

当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。

3、fragemnt

3.1、创建方式

(1)静态创建

首先我们需要创建一个xml文件,然后创建与之对应的java文件,通过onCreatView()的返回方法进行关联,最后我们需要在Activity中进行配置相关参数即在Activity的xml文件中放上fragment的位置。

(2)动态创建

动态创建Fragment主要有以下几个步骤:

创建待添加的fragment实例。

获取FragmentManager,在Activity中可以直接通过调用 getSupportFragmentManager()方法得到。

开启一个事务,通过调用beginTransaction()方法开启。

向容器内添加或替换fragment,一般使用repalce()方法实现,需要传入容器的id和待添加的fragment实例。

提交事务,调用commit()方法来完成。

3.2、Adapter对比

FragmnetPageAdapter在每次切换页面时,只是将Fragment进行分离,适合页面较少的Fragment使用以保存一些内存,对系统内存不会多大影响。

FragmentPageStateAdapter在每次切换页面的时候,是将Fragment进行回收,适合页面较多的Fragment使用,这样就不会消耗更多的内存

3.3、Activity生命周期

Activity的生命周期如下图:

5ea8c527d9165652b22598211fd8e993.png

(1)动态加载:

动态加载时,Activity的onCreate()调用完,才开始加载fragment并调用其生命周期方法,所以在第一个生命周期方法onAttach()中便能获取Activity以及Activity的布局的组件;

(2)静态加载:

1.静态加载时,Activity的onCreate()调用过程中,fragment也在加载,所以fragment无法获取到Activity的布局中的组件,但为什么能获取到Activity呢?

2.原来在fragment调用onAttach()之前其实还调用了一个方法onInflate(),该方法被调用时fragment已经是和Activity相互结合了,所以可以获取到对方,但是Activity的onCreate()调用还未完成,故无法获取Activity的组件;

3.Activity的onCreate()调用完成是,fragment会调用onActivityCreated()生命周期方法,因此在这儿开始便能获取到Activity的布局的组件;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android基础知识题,史上最全的Android面试题集锦 的相关文章

  • display:flex布局方式

    2009年 W3C提出了一种新的方案 Flex布局 可以简便 完整 响应式地实现各种页面布局 目前已得到所有现在浏览器的支持 Flex是Flexible Box的缩写 翻译成中文就是 弹性盒子 用来为盒装模型提供最大的灵活性 任何一个容器都
  • 元宇宙离我们有多远

    元宇宙离我们有多远 杨圆飞 202128015029001 No 145 元宇宙 Metaverse 即数字虚拟世界 电影 头号玩家 中的游戏 绿洲 黑客帝国 中的 矩阵 就是这样一个数字虚拟世界 因为这两个电影 人们对元宇宙有了具象化的认
  • JUC - 类汇总和学习指南

    一 概述 我们先来看下 JUC 的包括那些部分 Lock 框架和 Tools 类 把图中这两个放到一起理解 Collections 并发集合 Atomic 原子类 Executors 线程池 二 Lock 框架和 Tools 类 2 1 类
  • 解决org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:framework:compileDebugJav

    目录 介绍 解决方法1 解决方法2 解决方法3 解决方法4 解决方法5 解决方法6 解决方法7 介绍 今天在拉公司项目的时候报了一个奇怪的错误 在这里分享给大家 让大家少走弯路 报了这个错误信息其实有很多种可能性我依依把解决方案写在下面并且
  • 2022-12-18 网工进阶(三十八)MPLS LDP---LDP基础、工作原理(会话、标签的发布和管理、特性)、配置举例

    LDP概述 LDP是MPLS的一种控制协议 相当于传统网络中的信令协议 负责FEC的分类 标签的分配以及LSP的建立和维护等操作 LDP规定了标签分发过程中的各种消息以及相关处理过程 LDP的工作过程主要分为两部分 LSR之间建立LDP会话
  • PTA L2-034 口罩发放 (25 分)

    题目地址 L2 034 口罩发放 25 分 测试点 记录一下我遇到的坑 1 测试点4和测试点5的提交时间一样 卡排队顺序 2 有合法记录的 身体状况为 1 的申请人必须全部存下来 输出时再判重 不可以set直接存放判重 否则卡4 5 6测试
  • UDP的一对多通信(广播)

    补充 1 TCP通信采用一对一的通信模式 日常生活中的网络会议通知 广告 网络信息公告等功能 需要采用UDP实现一对多的群发功能 通过Internet实现群发功能的形式有两种 1 利用广播向子网中的所有客户发送消息 比如各类通知 单位公告
  • Day2-1 Maven工程、pom.xml工程管理、数据库连接和文件读写

    Maven工程 工具包 apache maven 3 5 4 bin tar gz 使用方法 解压后 在 conf settings xml文件配置镜像来源和本地存储目录等信息 并在STS关联 如下
  • JS中0.1+0.2!=0.3

    控制台打印测试 console log 0 1 0 2 0 30000000000000004 原因 1 存储原理 在计算机中数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的 在JS中数字采用的IEEE 754的双精度标准进行存储
  • C++【多线程】

    文章目录 一 什么是线程 二 创建线程 pthread create pthread join 三 线程退出 pthread exit pthread cancel 线程id pthread self 四 进程对于共享资源的访问 threa
  • 餐饮行业RPA之5大应用场景

    眼下 伴随着一系列风险因素 餐饮业的情况变得越来越困难 规模较小 财务状况较差的餐饮商户面临着极大的生存挑战 即使是有一定知名度和客源的大品牌餐饮加盟连锁店 也被逼到了墙角 近年来 餐饮业市场竞争激烈 而且同质化严重 即使没有疫情冲击 众多
  • 计算机恢复工具有哪些,电脑数据恢复软件选哪个?这三款恢复工具不容错过

    不论我们是使用电脑来编写学习论文 还是完成老师所留的专业作业 再或者是处理日常工作或者是紧急工作 我们都会在电脑上存储一些重要的文件 就算我们的电脑不是学习或工作所用的话 那么电脑上也会存储一些自己认为比较重要的文件的 即便我们将重要的文件
  • 基于SSM的图书管理系统

    一 系统简介 该项目是基于Java的SSM框架实现的图书管理系统 二 技术实现 1 后台框架 Spring SpringMVC MyBatis Ajax 2 UI界面 BootStrap 3 数据库 MySQL 5 7 4 加密 md5 随
  • java类库EthereumJ如何操作以太坊区块链

    在本文中 我们将看一下EthereumJ库 它允许我们使用Java与以太坊区块链进行交互 以太坊作为一种加密货币 利用去中心化 点对点 可编程区块链形式的数据库 以太坊虚拟机 EVM 通过连接不同的节点进行同步和操作 节点通过共识同步区块链
  • 哈夫曼树编码-C语言

    文章目录 哈夫曼树编码 1 实验目的 2 实验内容 3 实验工具 4 实验代码 5 实验结果 6 实验分析 7 资料 哈夫曼树编码 1 实验目的 了解二叉树的定义 理解二叉树的基本性质和存储结构 掌握哈夫曼树的构造 实现哈夫曼编码与译码算法
  • CVE-2017-16995————Ubuntu本地提权漏洞

    前言 近期看到了Ubuntu本地提权漏洞所以顺手演示一份 实践一波 漏洞描述 Ubuntu是一个以桌面应用为主的开源GNU Linux操作系统 基于Debian GNU Linux 近期有白帽子爆出 ubuntu 的最新版本 Ubuntu
  • 外置存储权限在哪打开_安卓手机外置sd卡权限怎么打开

    展开全部 在2 x的版本中 在manifest中配置的权限e68a843231313335323631343130323136353331333365643662android permission WRITE EXTERNAL STORA
  • bug: TypeError: Invalid attempt to spread non-iterable instance

    报错信息 分析 此类报错多为扩展运算符报错 问题代码 解决方式
  • Win11系统pin码忘记了怎么办?Win11忘记pin码解决方法

    Win11系统pin码忘记了怎么办 如果我们忘记了这个密码 那么就会导致无法进入到系统来使用电脑了 这个问题还是比较让人着急的 特别是需要开机进行电脑急用的用户 那么我们怎么去解决这个问题 接下来一起看看Win11忘记pin码解决方法 Wi

随机推荐

  • Windows时间戳的计算

    一 实验目的 掌握Windows中FileTime时间戳的手工解析方法 利用WinHex或X Ways等十六进制编辑器进行手工取证 把Windows中 MFT文件里记载的十六进制时间转化为 年月日时分秒 的可读时间 加深对于时间戳的理解 二
  • 日本核污水今日入海,这帮黑客怒了!

    自2011年东日本大地震以来 日本谋划已久的福岛核电站核污水排海计划已于8月24日下午起正式施行 预计排污周期长达30年 整个海洋及其生物都有可能遭受难不可逆的毁灭性打击 据现场媒体报道 经过17分钟的流淌 核污染水经由1公里的海底隧道流进
  • Web框架中的ORM框架

    Web框架中的ORM框架 在 Python 实现的 Web 框架中 通过 API 接口来访问后端的视图函数 视图函数对数据库中的数据进行处理然后返回给前端 在这个过程中 视图函数不是直接通过 SQL 来操作数据库 而是通过模型类的对象属性或
  • C语言练习题(15) 有如下代码,则 *(p[0]+1) 所代表的数组元素是( )(非常详细的讲解)

    1 有如下代码 则 p 0 1 所代表的数组元素是 int a 3 2 1 2 3 4 5 6 p 3 p 0 a 1 A a 0 1 B a 1 0 C a 1 1 D a 1 2 解析 C a 3 2 1 2 3 4 5 6 p 0 代
  • Ubuntu 16.04 gcc降级为4.8版本

    1 下载gcc g 4 8 sudo apt get install y gcc 4 8 sudo apt get install y g 4 8 2 链接gcc g 实现降级 cd usr bin sudo rm gcc sudo ln
  • 【算法与数据结构】236、LeetCode二叉树的最近公共祖先

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 根据定义 最近祖先节点需要遍历节点的左右子树 然后才能知道是否为最近祖先节点 那
  • localhost 已拒绝连接。

    Tomcat的localhost 8080拒绝访问 直接在tomcat的bin目录下双击startup bat 启动就好了 再访问localhost 8080就可以出来了
  • 坑爹公司大盘点 --- 转自拉钩

    那些年我们满怀憧憬迈入社会 却遭遇了理想与现实的碰撞 一起看看网上盘点的坑爹公司吧 遇到这样的公司真的是醉了 gt 转自拉钩 1 头衔公司 从入职第一天 就封你为大中华区销售总监 或者全球发行战略副总裁 全国市场委员会主席 然后没有手下 没
  • 如何有效保证Java代码单元测试覆盖率

    背景介绍 我们在实际项目开发过程中 不同level的童鞋由于专业技能的层次不同 导致在参与实际开发的业务代码中经常会出现各种bug 项目管理中好的pm或许会给充足的时间来让开发童鞋们定位修复这些bug 也有各种客观原因的PM不会在项目中预留
  • Spring Boot使用方法

    Spring Boot 七步走 1 勾选包 Spring Boot是自带TomCat的 创建Spring Boot工程文件 创建时需要更改资源下载地址 我选择阿里云的这个地址 而且Spring Boot不需要导包 只需要勾选需要的包 进入后
  • 深度学习基础:SVD奇异值分解及其意义【转】

    排版较好的一版 http shartoo github io SVD decomponent 上面的补充 奇异值的物理意义是什么 https www zhihu com question 22237507 answer 225371236
  • 使用 ELK 收集日志

    在当前分布式 微服务架构下 各个应用都部署在不同的服务器上 每个应用都在记录着自己重要或者不重要的日志信息 当我们要通过日志信息来排查错误时 可以根据出错应用在对应的机器上找报错相关的日志信息 但是 可能我们不具有相应服务器的访问权限 也可
  • 初学者入门:认识STM32单片机

    本教程含有较多专业词汇 大部分时候 不完全理解并不影响继续往下阅读 大家只需要了解大致的概念即可 当然 也鼓励大家多查百度和多问chatgpt 让自己学会的更多 什么是单片机 单片机 就是把中央处理器CPU 存储器 等计算机的功能部件 和定
  • C语言进阶:文件操作,学生信息管理系统

    文章目录 1 重定向 2 读文件和写文件 3 打开文件和关闭文件 4 综合大题 学生信息管理系统 5 二进制读文件和二进制写文件 6 文件定位 7 其他文件操作函数 8 系统再优化之用户登录与注册 1 重定向 重定向文件输出 把运行出来的内
  • WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

    今天琢磨着WindowsLinux子系统研究研究新东西 结果当我启动WSL时却出现了下面的提示 WSL启动报错 由于未安装所需的特性 无法启动操作 Error code Wsl Service CreateInstance CreateVm
  • url pattern中/与/*的区别

  • 爬虫入门级(五)

    Python爬虫入门级 五 实现两个小案例 1 gt 爬取豆瓣电影的TOP250 2 gt 爬取电影的资源下载地址 爬取豆瓣电影的TOP250 1 分页爬取数据 2 csv数据加载到本地 抓取豆瓣电影排行 1 判断页面元代满是否有数据 2
  • Postman 发送GET请求传递List自定义对象参数举例

    这是一个GET请求 后端接收方式 用List
  • 微服务简介

    微服务简介 微服务架构是一种软件架构模式 它将一个大型应用程序拆分为一组小型 独立的服务 每个服务都有自己的业务逻辑和数据存储 这些服务可以独立开发 部署和扩展 通常使用HTTP或其他轻量级通信协议进行通信 以下是微服务架构的一些关键特点和
  • android基础知识题,史上最全的Android面试题集锦

    Android基本知识点 1 常规知识点 1 Android类加载器 在Android开发中 不管是插件化还是组件化 都是基于Android系统的类加载器ClassLoader来设计的 只不过Android平台上虚拟机运行的是Dex字节码