首页 > 其他分享 >史上最全的Android面试题集锦

史上最全的Android面试题集锦

时间:2023-11-03 16:02:59浏览次数:34  
标签:面试题 Service onStartCommand START 集锦 startService Android 方法

前言

史上最全的Android面试题集锦_Android

由于之前从上海离职,来到深圳找工作。

然后准备面试的时候,发现网上很多Android面试题及答案整理都没有答案,

在成功的拿到几家公司的offer后(虽然不是阿里、网易这种级别的公司,但对我一个毕业三年的 Android 开发来说,算是成功的从小公司跳到大公司)

自己总结了一些最近面试过的 Android面试题以及答案。

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文件,这也是很多插件化技术的基础。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wplRTpg-1681543295494)(https://segmentfault.com/img/remote/1460000041136600 "image")]

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 也有一系列的生命周期回调函数,具体如下图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LeKWE03Q-1681543295495)(https://segmentfault.com/img/remote/1460000041136601 "image")]

通常,启动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参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。

public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) {
}

当Android面临内存匮乏的时候,可能会销毁掉你当前运行的Service,然后待内存充足的时候可以重新创建Service,Service被Android系统强制销毁并再次重建的行为依赖于Service中onStartCommand方法的返回值。我们常用的返回值有三种值,START_NOT_STICKYSTART_STICKYSTART_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回调函数。

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要《Android面试大厂必考174题》

Android面试大厂必考174题

纲要

1. SD卡
2. android的数据存储方式
3. BroadcastReceiver
4. sp频繁操作会有什么后果?sp能存多少数据?
5. dvm与jvm的区别
6. ART
7. Activity的生命周期

史上最全的Android面试题集锦_回调方法_02

8. Application能不能启动Activity
9. Activity的状态都有哪些
10. 横竖屏切换时Activity的生命周期****Activity的状态都有哪些
11. 如何设置activity成窗口样式
12. Activity的启动方式

史上最全的Android面试题集锦_Android_03

13. Service的生命周期
14. IntentService
15. Fragment和Activity的onCreateOptionsMenu
16. Service的onStartCommand有几种返回值
17. Service的onRebind什么情况下执行
18. Handler防止内存泄露
19. IntentFilter的匹配法则
20. Fragment与Activity传值
21. Fragment 生命周期

史上最全的Android面试题集锦_生命周期_04

22. Fragment的add和replace的区别 //replace==remove|append
23. Fragment如何实现Activity栈的压栈和出栈
24. 什么情况下造成内存泄露
25. 图片过大导致OOM
26. SoftReference跟WeakRefrence的区别
27. dp与px
28. 设置布局为一半宽、高
29. 多分辨率支持的清单文件配置
30. Android的事件分发机制

史上最全的Android面试题集锦_Android_05

31. ArrayList和LinkedList的区别
32. LruCache
33. 什么是ANR,如何规避
34. 描述Service的启动方式
35. Android有哪几种布局

史上最全的Android面试题集锦_回调方法_06


标签:面试题,Service,onStartCommand,START,集锦,startService,Android,方法
From: https://blog.51cto.com/u_16175637/8172282

相关文章

  • Android项目中引入aar包的新方法
    一、已过期的方法:1、把aar文件放在一个文件目录内,比如就放在工程的libs目录内;2、在app的build.gradle文件添加如下内容:(该配置和dependencies配置是一个位置级别)repositories{flatDir{dirs'libs'}}3、最后需要在dependencie......
  • 手机直播源码,Android Shape设置背景
    手机直播源码,AndroidShape设置背景设置背景时,经常这样android:background=“@drawable/xxx”。如果是纯色图片,可以考虑用shape替代。shape相比图片,减少资源占用,缩减APK体积。<?xmlversion="1.0"encoding="utf-8"?><shape  xmlns:android="http://schemas.android.c......
  • Android WiFi工具类
    ✍️作者简介:沫小北/码农小北(专注于Android、Web、TCP/IP等技术方向)</br>......
  • Java面试题:链表-合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}原题地址:https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337代码实现packagecom.example.demo.linked;......
  • android侧滑应用学习记录
    android侧滑菜单怎么禁止滑动1、点击图标,看看是哪个软件的快捷组件。打开软件的设置,取消桌面或其它界面显示就OK。另外,也可以通过权限设置,禁止软件显示通知等等,禁止这一类的组件和任务栏显示。2、打开“设置”面板;找到“个人”类里的“安全”选项。点击进入;找到选项“屏幕锁定”选......
  • 弯道超车,Android初级程序员进阶修炼手册
    前言是否有很多Android程序员已经进入了这么一种状态,感觉晋升无望,每天维护同样的模块,写的代码也很少出现bug,即使有bug也能迅速解决,当年对IT的热爱也快要消磨殆尽了。据统计,今年的毕业生将创历史新高,多达1158万。并不是说所有毕业生都会进入IT行业,但每年进入IT行业只多不少,而一直身......
  • Android FileProvider的一些事
    高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明:<providerandroid:......
  • Java面试题:链表-反转链表
    问题描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。示例输入:{1,2,3}返回值:{3,2,1}原题地址:https://www.nowcoder.com/practice/7......
  • Android新手必学-RecyclerView控件的使用
    Android新手必学-RecyclerView控件的使用简介在Android应用开发中,RecyclerView是一个非常重要和常用的控件,用于展示大量数据列表。相比于传统的ListView,RecyclerView提供了更好的性能和灵活性。本篇博文将介绍RecyclerView的基本用法和常见的功能,帮助Android新手快速上手使用Recycl......
  • 基于Android的记录生活APP-计算机毕业设计源码+LW文档
    摘 要近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,记录生活信息利用计算机网络实现信息化管理,使整个记录生活管理的发展和服务水平有显著提升。本文拟采用Android平台进行开发,使用java技术和Springboot搭建系统框架,后台使用MySQL数......