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

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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值