【Android面试】四大组件相关面试题(二)
一、Activity中onNewIntent方法的调用时机和使用场景?
在该Activity的实例已经存在于Task和Back stack中(或者通俗的说可以通过按返回键返回到该Activity )时,当使用 intent来再次启动该Activity的时候,如果此次启动不创建该Activity的新实例,则系统会调用原有实例onNewIntent() 方法来处理此intent.
且在下面情况下系统不会创建该Activity的新实例:
1、如果该Activity在Manifest中的android:launchMode定义为singleTask或者singleInstance.
2、如果该Activity在Manifest中的android:launchMode定义为singleTop且该实例位于Backstack的栈顶.
3、如果该Activity在Manifest中的android:launchMode定义为singleTop,且上述intent包含Intent.FLAG_ACTIVITY_CLEAR_TOP标志
4、如果上述intent中包含Intent.FLAG_ACTIVITY_CLEAR_TOP标志和且包含Intent.FLAG_ACTIVITY_SINGLE_TOP标志.
5、如果上述intent中包含Intent.FLAG_ACTIVITY_SINGLE_TOP 标志且该实例位于Back stack的栈顶。 上述情况满足其一,则系统将不会创建该Activity的新实例.
二、Intent传输数据的大小有限制吗?如何解决?
Intent 中的 Bundle 是使用 Binder 机制进行数据传送的, 数据会写到内核空间, Binder 缓冲区域; Binder 的缓冲区是有大小限制的, 有些 ROM 是 1M, 有些ROM 是 2M;这个限制定义在frameworks/native/libs/binder/processState.cpp 类 中 , 如果超过这个限制, 系统就会报错;
#define BINDER_VM_SIZE ((1*1024*1024) - (4096*2)) ;
因为 Binder 本身就是为了进程间频繁-灵活的通信所设计的, 并不是为了拷贝大量数据;如果非 ipc 就很简单了, static 变量, eventBus 之类的都可以;如果是 ipc, 一定要一次性传大文件, 可以用 file 或者socket;
三、说说ContentProvider、ContentResolver、ContentObserver 之间的关系?
ContentProvider:内容提供者, 用于对外提供数据,比如联系人应用中就是用了 ContentProvider:一个应用可以实现ContentProvider来提供给别的应用操作, 通过ContentResolver来操作别的应用数据
ContentResolver:内容解析者, 用于获取内容提供者提供的数据 ContentResolver.notifyChange(uri)发出消息
ContentObserver:内容监听者,可以监听数据的改变状态,观察(捕捉)特定的Uri引起的数据库的变化
ContentResolver.registerContentObserver()监听消息
概括: 使用ContentResolver来获取ContentProvider提供的数据, 同时注册ContentObserver监听数据的变化
四、说说Activity加载的流程?
App 启动流程(基于Android8.0):
点击桌面 App图标,Launcher进程采用 BinderIPC(具体为ActivityManager.getService 获取 AMS 实例) 向 system_server的AMS发起 startActivity请求,system_server 进程收到请求后,向 Zygote 进程发送创建进程的请求;
Zygote 进程 fork 出新的子进程,即 App 进程App 进程创建即初始化 ActivityThread,然后通过BinderIPC 向 system_server 进程的 AMS 发起attachApplication 请求,system_server 进程的 AMS 在收到attachApplication 请求后,做一系列操作后,通知 ApplicationThread bindApplication,然后发送H.BIND_APPLICATION 消息。
主线程收到 H.BIND_APPLICATION 消息,调用handleBindApplication 处理后做一系列的初始化操作, 初始化 Application 等,system_server 进程的 AMS 在 bindApplication 后,会调用 ActivityStackSupervisor.attachApplicationLocked, 之 后经过一系列操作,在 realStartActivityLocked 方法通过Binder IPC 向 App 进程发送scheduleLaunchActivity 请求;
App进程的 binder 线程(ApplicationThread)在收到请求后,通过 handler 向主线程发送LAUNCH_ACTIVITY 消息;主线程收到 message后经过 handleLaunchActivity,performLaunchActivity 方法,然后通过反射机制创建目标Activity;
#android面试#通过 Activityattach方法创建 window并且和 Activity 关联,然后设置 WindowManager 用来管理 window, 然后通知 Activity 已创建,即调用 onCreate,然后调用 handleResumeActivity,Activity可见