Hello,之前更新了面试中的Android的Java面试部分,这里会更新关于Android部分的面试题。
怎么拿下Android开发Android面试题?(二)
- 第一节 Android 四大组件相关
- 1.1 Activity 与 Fragment 之间常见的几种通信方式?
- 1.2 LaunchMode 的应用场景?
- 1.3 BroadcastReceiver 与
- 1.4 对于 Context,你了解多少?
 
 
 
第一节 Android 四大组件相关
1.1 Activity 与 Fragment 之间常见的几种通信方式?
viewModel 做数据管理,activity 和 fragment 公用同个
 viewModel 实现数据传递
1.2 LaunchMode 的应用场景?
LaunchMode 有四种,分别为 Standard, SingleTop,
 SingleTask 和 SingleInstance,下面说一下具体使用场景:
 Standard:
 Standard模式是系统默认的启动模式,一般我们 app 中
 大部分页面都是由该模式的页面构成的,比较常见的场景
 是:社交应用中,点击查看用户A信息->查看用户A 粉丝
 ->在粉丝中挑选查看用户B信息->查看用户A粉丝… 这种
 情况下一般我们需要保留用户操作 Activity栈的页面所
 有执行顺序。
 SingleTop:
 SingleTop 模式一般常见于社交应用中的通知栏行为功
 能,例如:App 用户收到几条好友请求的推送消息,需
 要用户点击推送通知进入到请求者个人信息页,将信息页
 设置为 SingleTop 模式就可以增强复用性。
 SingleTask:
 SingleTask 模式一般用作应用的首页,例如浏览器主页,
 用户可能从多个应用启动浏览器,但主界面仅仅启
 动一次,其余情况都会走onNewIntent,并且会清空主界
 面上面的其他页面。
 SingleInstance:
 SingleInstance 模式常应用于独立栈操作的应用,如闹钟
 的提醒页面,当你在A应用中看视频时,闹钟响了, 你
 点击闹钟提醒通知后进入提醒详情页面,然后点击返回
 就再次回到A的视频页面,这样就不会过多干扰到用户先
 前的操作了。
1.3 BroadcastReceiver 与
LocalBroadcastReceiver 有什么区别?
 BroadcastReceiver 是跨应用广播,利用Binder机制实现,
 支持动态和静态两种方式注册方式。
 LocalBroadcastReceiver 是应用内广播,利用Handler 实
 现,利用了IntentFilter的match功能,提供消息的发布与
 接收功能,实现应用内通信,效率和安全性比较 高,
 仅支持动态注册。
1.4 对于 Context,你了解多少?
Context也叫上下文,是有关应用程序环境的全局信息的接
 口。这是一个抽象类, 它允许访问特定于应用程序的资源和
 类,以及对应用程序级操作的调用,比如启动活动,发送广
 播和接收意图等;
 Activity,Service,Application都是 Context的子类。
 享学课堂
 Context 的具体实现类是 ContextImpl, 还有一个包装类
 ContextWrapper, ContextWrapper 的 子 类 有 Service ,
 Application,ContextThemeWrapper, Activity 又是
 ContextThemeWrapper 的子类,
 ContextThemeWrapper 也可以叫 UI Context,跟UI 操作相关
 的最好使用此类 Context。
 ContextWrapper 中有个 mBase,这个 mBase 其实是
 ContextImpl,它是在Activity, Service, Application 创建时通过
 attachBaseContext()方法将各自对对应
 ContextImpl 赋值的。对 context 的操作,最终实现都是在
 ContextImpl。
 对于 startActivity操作
- 当为Activity Context则可直接使用;
- 当为其他Context, 则必须带上
 FLAG_ACTIVITY_NEW_TASK flags才能使用;因为非 Activity
 context启动 Activity没有 Activity栈,则无法启动,因此需要
 加开启新的栈;
- 另外UI相关要Activity中使用. getApplication()和getApplicationContext()区别?
- 对于Activity/Service来说,getApplication()和
 getApplicationContext()的返回值完全相同; 除非厂商修改过接口;
- BroadcastReceiver在onReceive的过程, 能使用
 getBaseContext().getApplicationContext获取所在
 Application, 而无法使用getApplication;
- ContentProvider能使用
 getContext().getApplicationContext()获取所在Application. 绝大多数情况下没有问题, 但是有可能会出现空指针的问题, 情况如下:
 当同一个进程有多个apk的情况下, 对于第二个apk是由
 provider方式拉起的, 前面介绍过provider创建过程并不
 会初始化所在application, 此时执行
 getContext().getApplicationContext()返回的结果便是
 NULL. 所以对于这种情况要做好判空.