0

0

Android面试题之四大组件篇

藏色散人

藏色散人

发布时间:2020-07-31 14:27:08

|

4748人浏览过

|

来源于csdn

转载

推荐:《2020年Android面试题大汇总【收藏】》

Android面试题(四大组件篇)

window、进程、线程篇

Android面试题(数据存储、view篇)

 

Activity


Q:说下Activity的生命周期?


Q:onStart()和onResume()/onPause()和onStop()的区别?

是否位于前台,对用户是否可见的区别


Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

A会回调onPause()>>onStop(),透明则不会调用onStop(),对话框则不会调用onPause()和onStop()


Q:谈谈onSaveInstanceState()方法?何时会调用?

当Activity意外销毁时再重新创建时会调用此方法,比如横竖屏切换,会导致重新创建Activity,onSaveInstanceState()方法的调用在onStop()之前,用于保存当前Activity的状态,当Activity被重新创建后,会调用onRestoreInstanceState()来恢复Activity的状态,onRestoreInstanceState()的调用在onStart()之前。


Q:onSaveInstanceState()与onPause()的区别?

两者执行没有固定的先后顺序。

onsavedinstance(Bundle savedinstancestate)方法的触发时机,其典型的情景是按home键或者切换activity,这样的activity可能被销毁的场合,但是按back键退出程序,则不会调用此方法,适合保存一些非持久性的数据(即程序运行期间需要储存的数据)。

而onpause(),不管是可能销毁还是退出程序,都必须调用,适合保存持久性的数据,但是android本身没有为此方法提供bundle参数,因此我们可以选用做一个静态变量或者是提供一个sharedpreference作为数据载体。

 

Q:如何避免配置改变时Activity重建?

在清单文件下每个activity注册时写上

android:configChanges=“XXX”

比如横竖屏切换:android:configChanges=“orientation”

 

Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?

1.当app处于后台被系统回收时,app的进程被杀死了,Activity 也被回收了,而app的task和activity栈以及相应的intent和数据会被系统保存起来。当app被切回前台时,系统会恢复task和activity栈以及相应的intent和数据。
2.不要在Application类和全局单例类中存放数据,会导致app无法正确恢复状态。运行时的临时数据应存放在SharedPreference、临时文件或数据库中
3 Activity之间传数据应该用系统提供的intent机制。

 

Q:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)

https://blog.csdn.net/mountain_hua/article/details/81481241242


Q:谈谈singleTop和singleTask的区别以及应用场景

栈顶复用:解决重复打开Activity的问题。

栈内复用:当一个任务栈要调用另一个程序的Activity的时候,如下:


Q:onNewIntent()调用时机?

当进行singleTop和singleTask模式的时候,存在对应的Activity,即会调用该Activity的onNewIntent()。


Q:了解哪些Activity启动模式的标记位?

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//指定singleTask模式,与在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同
 
Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
//指定singleTop模式,与在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同
 
Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//具有这个标志的Activity启动时,在同一个任务栈中所以位于它上面的Activity都要出栈,一般会和singleTask模式一起出现
 
Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
//具有这个标志的Activity不会出现在历史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"
标记位优先级比在AndroidManifest中指定优先级高


Q:如何启动其他应用的Activity?

SingleTask和taskAfiinity配合使用


Q:Activity的启动过程?

https://www.jianshu.com/p/9ecea420eb52

 

Fragment


Q:谈一谈Fragment的生命周期?

下图很好的描述了 Fragment 与 Activity 生命周期的关系

Q:Activity和Fragment的异同?

1、从最基础的开始说--->生命周期

Activity有7个生命周期:onCreate(); onStart(); onResume(); onPause(); onStop(); onDestroy(); onRestart();

Fragment有11个生命周期:onAttach(); onCreate(); onCreateView(); onActivityCreate(); onStart(); onResume(); onPause(); onStop(); onDestroyView(); onDestroy(); onDetach();

所以Fragment比较与Activity来说会更加灵活,因为生命周期多了,你可以控制的地方也就多了。

2、从灵活性上来说

Cliclic AI
Cliclic AI

Cliclic商品背景图编辑器是一款功能强大的AI工具,帮助用户快速生成具有吸引力的商品图背景。

下载

Activity是四大组件之一,是每个页面的承载,一个就是一个,Fragment的显示要依赖于Activity,从Fragment的生命周期中就可以了解到。

Fragment是一个一个的小碎片

    1)相比较与Activity来说更加灵活,可以在XML文件中直接进行写入,也可以在Activity中动态添加;

    2)可以使用show()/hide()或者replace()随时对Fragment进行切换,并且切换的时候不会出现明显的效果,用户体验会好;Activity虽然也可以进行切换,但是Activity之间切换会有明显的翻页或者其他的效果,在小部分内容的切换上给用户的感觉不是很好

 

Q:Activity和Fragment的关系?

Fragment的显示要依赖于Activity,从Fragment的生命周期中就可以了解到。


Q:何时会考虑使用Fragment?

类似微信下方菜单栏,以及手机和平板适配等

Service


Q:谈一谈Service的生命周期?

https://www.cnblogs.com/huihuizhang/p/7623760.html


Q:Service的两种启动方式?区别在哪?

start是直接启动,bound是与当前activity绑定。


Q:一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?

如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。


Q:Service如何和Activity进行通信?

  1. Activity调用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service对象的一个引用,这样Activity可以直接调用到Service中的方法,如果要主动通知Activity,我们可以利用回调方法
  2.  Service向Activity发送消息,可以使用广播,当然Activity要注册相应的接收器。比如Service要向多个Activity发送同样的消息的话,用这种方法就更好

 

Q:用过哪些系统Service?

https://blog.csdn.net/geyunfei_/article/details/78851024


Q:是否能在Service进行耗时操作?如果非要可以怎么做?

Service是运行在主线程中的,一般不能在Service进行耗时操作,如果非要,可以使用远程Service开启新进程。


Q:AlarmManager能实现定时的原理?

AlarmManager提供对系统警报服务的访问。这些允许您在将来的某个时间点运行应用程序。当警报响起时,系统会广播已注册的意图,如果目标应用程序尚未运行,则自动启动它。当设备处于休眠状态时,会保留已注册的警报(如果设备在此期间发生故障,可以选择将其唤醒),但如果设备被关闭并重新启动,则会清除该警报。警报管理器持有一个CPU唤醒锁,只要警报接收器的onReceive()方法正在执行。这保证了在你处理完广播后,手机才会休眠。一旦onReceive()返回,警报管理器将释放此唤醒锁。这意味着,在某些情况下,只要onReceive()方法完成,手机就会休眠。如果您的警报接收器调用Context.startService(),那么在启动所请求的服务之前,手机可能会休眠。为了防止这种情况发生,您的BroadcastReceiver和Service将需要实现一个单独的唤醒锁定策略,以确保在服务可用之前继续运行电话。


Q:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?

前台服务即对用户可见的服务,可以以通知的形式创建前台服务


Q:是否了解ActivityManagerService,谈谈它发挥什么作用?

ActivityManagerService(以后简称AMS)Android中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似,因此它在Android中非常重要 


Q:如何保证Service不被杀死?

onStartCommand方法中,返回<strong>START_STICKY</strong>

StartCommand()几个常量:

  • START_STICKY 
    系统重新创建服务并且调用onStartCommand()方法,但并不会传递最后一次传递的intent,只是传递一个空的intent。除非存在将要传递来的intent,那么就会传递这些intent。这个适合播放器一类的服务,不需要执行命令,只需要独自运行,等待任务。
  • START_NOT_STICKY 
    系统不重新创建服务,除非有将要传递来的intent。这是最安全的选项,可以避免在不必要的时候运行服务。
  • START_REDELIVER_INTENT 
    系统重新创建服务并且调用onStartCommand()方法,传递最后一次传递的intent。其余存在的需要传递的intent会按顺序传递进来。这适合像下载一样的服务,立即恢复,积极执行。

提升Service优先级

前台服务是被认为用于已知的正在运行的服务,当系统需要释放内存时不会优先杀掉该进程。

在onDestory()中发送广播开启自己

service+broadcast方式,就是当service调用到ondestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。当然,从理论上来讲这个方案是可行的,实验一下结果也是可行的。但是有些情况下,发送的广播在消息队列中排的靠后,就有可能服务还没有接收到广播就销毁了(只是猜想)。所以为了能让这个机制完美运行,可以开启两个服务,相互监听,相互启动。服务A监听B的广播来启动B,服务B监听A的广播来启动A。经过实验,这个方案是可行的。

 

Broadcast Receiver


Q:广播的两种注册形式?区别在哪?

广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。

动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。

ContentProvider


Q:ContentProvider了解多少?

(1)android平台提供了ContentProvider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。

(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。

(3)ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。

(4)开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。

(5)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

 

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号