安卓面试题之四大组件相关以及答案总结

1.activity和fragment通信有哪几种方式?

答:接口方式回调、Bundle通信 、 eventbus、广播、 数据库、文件、SharedPreferences,ContentProvider

2.LaunchMode 有哪几种模式,分别的应用场景是什么?

答:LaunchMode有四种模式,分别是standard,singleTop,singleTask,singleInstace.

standard模式是系统默认的启动模式,一般我们的app中大部分页面都是由这个模式的页面构成。

SingleTop模式一般常用于通知栏,例如:用户收到的多条推送消息,需要用户点击进入推送信息页面,将信息页面设置成singleTop模式可以增强复用性。

SingleTask模式一般用于应用的首页,用户可能有多个页面,但是首页只会有一个。

SingleInstance模式常用于独立栈操作的应用中,如闹钟的提醒,当你在A应用中看视频,闹钟响了,你点击闹钟进入闹铃详情页面,然后点击返回退出就回再次回到A应用的视频界面,这样就不会干扰到用户之前的操作。

3.谈一谈startService和bindService的区别,生命周期以及使用场景?

区别:对应着动态绑定和静态绑定; 静态对应着startService,动态对应着bindService,静态有自己独立的生命周期,动态会依附activity等组件的生命周期。

生命周期: onCreate → startCommand → onDestroy
onCreate → onBind→onUnBind→ onDestroy

使用场景:即上述区别,如果需要一直存在的服务,即静态绑定,反之依赖于组件

4.Service如何进行保活?

利用系统广播拉活
利用系统service拉活
利用Native进程拉活<Android5.0以后失效> fork进行监控主进程,利用native拉活
利用JobScheduler机制拉活<Android5.0以后>
利用账号同步机制拉活

5.简单介绍下ContentProvider是如何实现数据共享的?

当一个应用程序要把自己的数据暴露给其他程序时,可以通过ContentProvider来实现。
其他应用可以通过ContenrResolver来操作ContentProvider暴露的数据。

定义自己的ContentProvider类,该类需要继承Android系统提供的ContentProvider基类。

在Manifest.xml 文件中注册ContentProvider,(四大组件的使用都需要在Manifest文件中注册) 注册时需要绑定一个URL

调用Activity的ContentResolver获取ContentResolver对象
调用ContentResolver的insert(),delete(),update(),query()进行增删改查。
一般来说,ContentProvider是单例模式,也就是说,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentResolver。

6.切换横竖屏时Activity的生命周期?

竖屏:onCreat->onStart->onResume.
切换横屏时:onPause-> onSaveInstanceState ->onStop->onDestory

onCreat->onStart->onSaveInstanceState->onResume.

但是,我们在如果配置这个属性:android:configChanges="orientation|keyboardHidden|screenSize"
就不会在调用Activity的生命周期,只会调用onConfigurationChanged方法

7.Activity中onNewIntent方法的调用时机和使用场景?

onNewIntent的调用时机:只要该Activity实例在栈中存在,每次复用Activity的时候,都会调用onNewIntent,而不会重新创建Activity实例。
singleTop、singleTask、singleInstance模式下都会调用onNewIntent()。
调用onNewIntent()生命周期如下:onNewIntent()->onRestart()->onStart()->onResume()。
注意:在onNewIntent()中一定要设置setIntent(intent),否则getIntent()时获取到的是旧的intent,而不是新的intent。

8.Intent传输数据的大小有限制吗?如何解决?

Intent 中的 Bundle 是使用 Binder 机制进行数据传送的, 数据会写到内核空间, Binder 缓冲区域;
Binder 的缓冲区是有大小限制的, 有些 ROM 是 1M, 有些 ROM 是 2M;
这个限制定义在 frameworks/native/libs/binder/processState.cpp 类中, 如果超过这个限制, 系统就会报错;

因为 Binder 本身就是为了进程间频繁-灵活的通信所设计的, 并不是为了拷贝大量数据;
如果非 ipc 就很简单了, static 变量, eventBus 之类的都可以;
如果是 ipc, 一定要一次性传大文件, 可以用 file 或者 socket;

9.说说ContentProvider、ContentResolver、ContentObserver 之间的关系

使用ContentResolver来获取ContentProvider提供的数据,同时注册ContentObserver监听Uri数据的变化

10.Activity加载的流程?

一个APP启动的入口是ActivityThread的main, 而且这个Main方法是有系统进程启动的。
1、 在ActivityThread main方法中, 他会自己创建自己,并调用自己的attch方法,在这个方法里会获取一个叫IActivityManager的AMS代理,调用AMS的bindApplication方法,在AMS中,系统进程会创建一个app需要的一些比较的参数,如 pid uid等等,封装完成以后通过一个IApplicationThread的app进程的代理,调用bindApplication 绑定好Application创建的一些必要信息,然后通过handle发送消息并makeApplication创建出Application。
2、完成application创建,调用application的oncreate方法。在完成上面操作以后,AMS进程binapplication 完成以后,会继续通过一个叫ActivityStackSupervisor 继续调用启动Activity的方法,有个关键方法叫realStartActivityLock方法,它会创建ClientTransaction对象并且将LaunchActivityItem对象传递进去,最后还是通过IApplicationThread调用schedule方法。回到APP进程中,执行ClientTransaction的LaunchActivityItem的启动Activity方法,最后调用ActivityThread的handleLaunchActivity。他会通过反射创建出一个Activity对象并且,执行attch和onCreate、onStart 以及OnResume方法。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
四大组件是指Android应用开发中的四个核心组件,包括Activity、Service、BroadcastReceiver和ContentProvider。 ActivityAndroid应用中的页面承载组件,用于展示用户界面和处理用户交互。它是每个页面的承载,一个Activity就是一个页面。Fragment是依赖于Activity的,它的显示与Activity的生命周期密切相关。 Service是一种在后台运行的组件,用于执行长时间运行的任务或处理远程请求。它没有用户界面,可以在后台执行任务,即使用户切换到其他应用程序,服务也可以继续工作。 BroadcastReceiver是一种用于接收和响应广播消息的组件。它可以接收系统广播或自定义广播,然后根据接收到的广播消息执行相应的操作。 ContentProvider是一种用于管理应用程序中各个组件之间共享数据的组件。它提供了一种统一的接口,允许应用程序之间共享数据,包括访问和修改数据的能力。 在面试中,可能会问到Activity的四种启动模式,它们分别是: 1. Standard(标准模式):默认启动模式,每次启动都会创建一个新的实例。 2. SingleTop(单顶模式):如果Activity位于栈顶,则不会创建新的实例,而是重用栈顶的实例。 3. SingleTask(单任务模式):如果Activity在返回栈中已经存在,则将其上面的Activity全部出栈,使得该Activity成为栈顶,如果Activity不存在,则创建新的实例。 4. SingleInstance(单实例模式):该Activity独占一个返回栈,其他应用程序无法共享该实例,它会在一个新的任务中启动。 在返回栈中,Activity的顺序是栈底到栈顶,栈顶的Activity即为当前显示的Activity。根据启动模式的不同,返回栈中的Activity可能会发生变化。例如,使用SingleTask模式启动一个Activity时,如果该Activity在返回栈中已经存在,则会将其上面的所有Activity出栈,使得该Activity成为栈顶。 至于Fragment,它有11个生命周期方法,包括onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()、onPause()、onStop()、onDestroyView()、onDestroy()和onDetach()。这些方法可以用于管理Fragment的生命周期,如创建、销毁、显示和隐藏等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android面试题四大组件篇)](https://blog.csdn.net/augfun/article/details/105237121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值