简单
android 基础
对于面向对象的六大基本原则了解多少
- 单一职责(Single Responsibility Principle):一个类只做一件事,可读性提高
- 里式替换原则( Liskov Substitution Principle):依赖继承和多态,就是能用父类的地方就可以用子类替换,用子类的但不能用父类。
- 依赖倒置原则(Dependence Inversion Principle):依赖抽象,就是模块之间的依赖通过抽象发生。
- 开闭原则(Open-Close Principle):不管是实体类,模块还是函数都应该遵循对扩展开放对修改关闭。还是要依赖封装和继承
- 接口隔离原则(Interface Segregation Principle):一个类对另一个类的依赖应该建立在最小的接口上,如果接口太大,我们需要把它分割成一些更细小的接口,也是为了降低耦合性
- 迪米特原则(Law of Demeter ):也称最少知识原则,也就是说一个类应该对自己需要耦合或者调用的类知道的最少,只需知道该方法即可,实现细节不必知道。
view的事件分发
1.触发过程:Activity->Window->DocerView->ViewGroup->View,View不触发再返回由父级处理依次向上推。 2.在每个阶段都要经过三个方法 dispatchTouchEvent(分发)、onInterceptTouchEvent(拦截)、onTouch(处理)
大体流程: Activity中走了Window 的 dispatch,Window 的 dispatch 方法直接走了 DocerView 的 dispatch 方法,DocerView 又直接分发给了 ViewGroup,ViewGroup 中走的是 onInterce 判断是否拦截,拦截的话会走 onTouch 来处理,不拦截则继续下发给 View。到 View 这里已经是最底层了,View 若继续不处理,那就调用上层的 onTouch 处理,上层不处理继续往上推。
launch mode
(1) standard:标准的启动模式。
(2) singleTop:单一顶部模式
如果 Activity 已经被开启,并且处于任务栈的栈顶,就不会创建新的 Activity,而是复用这个已经开启的 Activity。为了防止出现一些奇怪的用户体验,推荐使用单一顶部模式,整个任务栈可以有多个实例存在.应用场景:短信发送界面.
(3)singletask:单一任务栈
在整个任务栈里面只允许有一个当前 Activity 的实例存在如果要开启的 Activity 在任务栈中已经存在,直接复用这个已经存在的 Activity,并且把这个 Activity 上面的所有的其他 Activity 给清空应用场景:如果一个 Activity 非常消耗内存和 cpu 资源,建议把这个 Activity 做成 singletask 的模式。浏览器的 browserActivity
(4)singleinstance:单一实例.
整个手机操作系统只有一个实例存在,并且是运行在自己单独的任务栈里面.应用场景:通话界面的 Activity
请谈谈 invalidate() 和 postInvalidate() 方法的区别和应用场景?
参考答案:
- invalidate()用来重绘UI,需要在UI线程调用。
- postInvalidate()也是用来重新绘制UI,它可以在UI线程调用,也可以在子线程中调用,postInvalidate()方法内部通过Handler发送了一个消息将线程切回到UI线程通知重新绘制,并不是说postInvalidate()可以在子线程更新UI,本质上还是在UI线程发生重绘,只不过我们使用postInvalidate()它内部会帮我们切换线程
Fragment 的生命周期?
参考答案:
1,onAttach:fragment 和 activity 关联时调用,且调用一次。在回调中可以将参数 content 转换为 Activity保存下来,避免后期频繁获取 activity。
2,onCreate:和 activity 的 onCreate 类似
3,onCreateView:准备绘制 fragment 界面时调用,返回值为根视图,注意使用 inflater 构建 View时 一定要将 attachToRoot 指明为 false。
4,onActivityCreated:activity 的onCreated 执行完时调用
5,onStart:可见时调用,前提是 activity 已经 started
6,onResume:交互式调用,前提是 activity 已经 resumed
7,onPause:不可交互时调用
8,onStop:不可见时调用
9,onDestroyView:移除 fragment 相关视图时调用
10,onDestroy:清除 fragmetn 状态是调用
11,onDetach:和 activity 解除关联时调用
从生命周期可以看出,他们是两两对应的,如 onAttach 和 onDetach ,
onCreate 和 onDestory ,onCreateView 和 onDestroyView等
谈一谈单例模式,建造者模式,工厂模式的使用场景?如何合理选择?
参考答案:
- 单例模式:保证全局只有一个实例,如网络请求
- 建造者模式:用于需要设置比较多的属性可以用直接链式,如AlerDialog
- 工厂模式:用于业务的实体类创建,易于扩展,如BitMapFactory
中等
view的绘制流程
MVC、MVP、MVVM
(1) MVC,Model View Controller,是软件架构中最常见的一种框架,简单来说就是通过 controller 的控制去操作 model 层的数据,并且返回给 view 层展示。当用户发出事件的时候,view 层会发送指令到 controller 层,接着 controller 去通知 model 层更新数据,model 层更新完数据以后直接显示在 view 层上,这就是 MVC 的工作原理。
(2) MVP 是 MVC 的演化。MVP 的 model 层相对于 MVC 是一样的,而 activity 和 fragment 不再是 controller 层,而是纯粹的 view 层,所有关于用户事件的转发全部交由 presenter 层处理。presenter 层充当了桥梁的作用,用于操作 view 层发出的事件传递到 presenter 层中,presenter 层去操作 model 层,并且将数据返回给 view 层。
(3) MVVM 和 MVP 的区别貌似不大,只不过是 presenter 层换成了 viewmodel 层,还有一点就是 view 层和 viewmodel 层是相互绑定的关系,这意味着当你更新 viewmodel 层的数据的时候,view 层会相应的变动 ui。
是否使用过 IntentService,作用是什么, AIDL 解决了什么问题?
(1) IntentService 继承自 Service。由于 Service 运行在主线程,无法进行耗时操作。所以你需要在 Service 中开启一个子线程,并且在子线程中运行。为了简化这一操作,Android 中提供了 IntentService 来进行这一处理。通过查看 IntentService 的源码可以看到,在 onCreate 中,我们开启了一个 HandlerThread 线程