不管你是做手机系统开发还是APP开发,Framework层你肯定会碰到。除非你所做的事情只是UI的优化。
所以在面试途中,也会少不了面试官对你所掌握的Framework 层的水准进行检测,而一般常见的Android Framework连环炮面试问题有这些:
1.什么是Android Framework?它包含哪些组件和服务?
2.目前的Android Framework版本是什么?相较于之前的版本有哪些改进?
3.请解释一下Activity、Service、ContentProvider和BroadcastReceiver的作用和区别。
4.请介绍一下Activity的生命周期,可以画出生命周期图吗?
5.Service有哪几种启动方式?它们的区别是什么?
6.什么是AIDL?请介绍一下它的作用和使用方式。
7.请解释一下Binder是什么,它在Android Framework中的作用是什么?
8.什么是页面调度,它是如何实现的?
9.Android Framework提供哪些常用系统服务?它们的作用是什么?
10.如何在系统中注册和使用BroadcastReceiver?
下面我就来进行一一的分析解答:
Android Framework是Android系统的应用程序框架,提供了开发Android应用程序所需的基本功能和结构。它包含了各种组件和服务,使得开发人员可以轻松编写出具有高度复杂性的应用程序。Android Framework包含以下组件和服务:
这些组件和服务构成了Android Framework的核心部分,为Android应用程序提供了丰富的功能和特性。
当前的Android Framework版本是Android 11。
相较于之前的版本,Android 11的改进主要包括以下几点:
总体来说,Android 11提供了更好的用户体验和功能支持,同时也加强了安全性和隐私保护,为Android应用程序的开发和实现提供了更强的基础和支持。
Activity、Service、ContentProvider和BroadcastReceiver是Android应用程序四大组件,它们各自担当着不同的角色和功能,下面进行详细解释:
总的来说,Activity、Service、ContentProvider和BroadcastReceiver都是Android应用程序中非常重要的组件,它们各自有不同的作用和功能,可以用于实现不同的应用需求和场景。
Activity的生命周期分为7个阶段,分别是:
下面是Activity生命周期图:
可以看到,Activity的生命周期由四个阶段组成:运行期、暂停期、停止期和销毁期。在实际开发中,我们需要根据不同的业务需求,在不同的生命周期方法中执行不同的操作。同时,在开发过程中也需要注意避免生命周期的问题,如内存泄漏、突然退出等问题。
Service有两种启动方式:startService()和bindService()。它们的区别如下:
1. startService() ,以Start方式启动Service:
它是一种单向的启动方式,即Activity通过startService()方法启动Service后,即使该Activity已经被销毁,Service也可以在后台继续运行。同时它还支持在Service中实现多线程操作,在Service中的onCreate()会被调用一次,onStartCommand()会被调用多次,每一次onStartCommand()都表示启动了一个新的Service。当使用stopService()或stopSelf()停止Service时,onDestroy()方法会被调用。
2. bindService(),以Bind方式启动Service:
它是一种双向的启动方式,即Activity和Service通过bindService()方法建立起连接,Activity可以和Service进行通信,而Service也可以向Activity发送数据。使用该方式启动Service时必须要实现ServiceConnection接口中的两个回调方法:onServiceConnected()和onServiceDisconnected()。当Activity被销毁时,Service会自动销毁。当没有任何Activity与Service绑定时,该Service仍在后台运行,但仅限于onStartCommand()方法的返回值不是START_STICKY、START_REDELIVER_INTENT时,即不进行多次启动Service,但这时Service仍然可以调用stopSelf()方法手动停止Service。
总结:通过startService()方法启动Service可以在后台进行操作,而通过bindService()方法启动Service则更好地实现了Activity和Service的通信。同时,Service被绑定的开销会比startService()方式启动Service大,使用哪种方式启动Service应根据业务需求和开发需求来决定。
AIDL(Android Interface Definition Language)是Android的一种跨进程通信(IPC)技术,它提供了一种机制使你能够跨进程传输数据,让你能够在模块之间进行通信与数据交换。AIDL通过在客户端与服务端的进程之间建立桥梁,允许某个进程调用另一个进程的方法,同时允许客户端应用程序和远程服务应用程序共享数据。
AIDL主要的作用就是实现进程间的通信,允许一个进程调用另外一个进程的方法,同时也允许在不同的进程之间共享数据。它是Android提供的一种简单可靠的IPC方案,可用于实现多个进程间的数据共享和交互。
AIDL使用方式:
1. 定义接口:首先在服务端中定义一个接口,如果需要进行跨进程通信,需要在接口方法上面加上RemoteException声明;
2. 生成接口文件:编译器将接口文件转化成Java类,并生成相应的 Java 接口文件、Java Binder 文件和 Java Proxy 文件;
3. 实现接口:在服务端,实现客户端定义的接口,并将其方法注册到 Binder 中;
4. 客户端调用:在客户端中,创建一个 ServiceConnection 实现类和 IBinder 对象,通过该对象调用服务端接口的方法就可以实现跨进程通信。
需要注意的是,AIDL的使用需要考虑线程安全问题,需要在接口方法上使用synchronized锁,保护数据的安全性。
Binder是Android中进程间通信(IPC)的一种机制,用于实现跨进程通信,它是Android的底层系统服务。
在Android Framework中,Binder的作用可以概括为以下几个方面:
1. 实现进程间通信:Binder是一种轻量级的IPC机制,在Android中通过Binder将进程间的通信变得更加高效和方便。
2. 提供进程间对象传输:Binder 不仅仅能传递基本类型和简单对象,还能将在 Binder 中寄存和管理的对象在不同进程间传输和操作。
3. 提供安全的进程间通信:Binder基于Client/Server模型,在多个进程中传递数据,能够保证每个进程之间的安全性和独立性。
4. 实现多线程并发:利用Binder机制实现跨进程并发调用。
总之, Binder 是 Android 中的核心系统服务,扮演着连接 Android 应用程序与底层系统服务的关键角色,对 Android 系统的平稳运行起着重要的作用。
页面调度(Page swapping)是操作系统中的一种内存管理技术,用于将内存中的某些不常用的页面(也称内存块)挪移到磁盘上,以释放出足够的内存空间,让其他进程可以使用。当一个进程需要访问被调度到磁盘上的页面时,操作系统会将其调入内存,然后再进行访问。
页面调度是实现虚拟内存机制的一部分。虚拟内存机制是将内存分为多个页或块,每个页或块都是固定的大小。而程序的虚拟地址空间也是被分成了一定数量的页或块。因此,当程序需要访问一个虚拟地址时,操作系统会首先查找该地址所对应的物理页是否在内存中,如果不在,系统就会将其调入内存,这就是页面调度。
页面调度通常会使用一些算法来进行页面的选择。常见的算法有最近最少使用算法(LRU)、先进先出算法(FIFO)、最不经常使用算法(LFU)等。算法的选择取决于不同的情况和应用场景。
在实现页面调度时,操作系统需要维护一张页表来记录虚拟地址与物理地址之间的映射关系。当发生页面调度时,操作系统需要更新页表中的相关信息,以反映出内存中已经被换入或被换出的页的情况。
总之,页面调度是操作系统中的一个重要技术,它可以通过动态地调度内存中的页面来提高系统的整体性能。
Android Framework提供了许多常用的系统服务,以下是其中一些比较常用的系统服务及其作用:
以上这些系统服务涵盖了多种应用场景,开发者可以根据自己的需要,通过调用系统服务,实现自己想要的功能。例如,利用TelephonyManager可以实现拨打电话、发送短信等功能;利用LocationManager可以实现定位服务;利用NotificationManager可以实现消息通知等功能。
注册和使用 BroadcastReceiver 可以分为以下几个步骤:
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// 处理接收到的广播
}
}
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.example.ACTION_MY_BROADCAST"/>
intent-filter>
receiver>
val intent = Intent("com.example.ACTION_MY_BROADCAST")
sendBroadcast(intent)
在发送广播时,可以通过 Intent 设置广播的数据和额外的信息,例如:
val intent = Intent("com.example.ACTION_MY_BROADCAST")
intent.putExtra("key", "value")
sendBroadcast(intent)
在 BroadcastReceiver 的 onReceive() 方法中,可以通过 Intent 获取广播的数据和额外信息,例如:
override fun onReceive(context: Context?, intent: Intent?) {
val data = intent?.getStringExtra("key")
// 处理接收到的广播数据
}
值得注意的是,一些系统广播可能需要特定的权限才能接收。此外,为了避免可能存在的内存泄漏问题,建议在不需要使用 BroadcastReceiver 时取消注册广播。
其实像Framework 相关的面试问题还有很多,由于文章的篇幅长度有限,这里就只能简单的举几个相关的面试题及参考答案在此分享给大家。而我们在面试中,当面试官问到这一块内容是,大多是人只会回答出几个简单的问题,如果往深入点问,有些人就懵了。为此这里为大家准备了,Framework相关的学习复习文档以及更多的面试题参考:https://qr18.cn/AQpN4J
。
https://qr18.cn/AQpN4J
https://qr18.cn/CgxrRy
记录的这些问题和知识点,只是用来参考与检测你对其知识点的掌握程度,并不是你在面试中一定会遇到。面试官会根据每个人不同的情况,有浅入深的提问。所以我们需要认真的理解了解每一个知识点,这样才会有效面对面试官的问题和解决项目中会遇到的问题。