Android 面试技能树梳理

相信大家都有面试的经历,相对比面试官的问的一些问题其实都是基础的知识,但就是一些基础的知识我们也不是很完美的回答出来,我们也知道现在的开发人员很多,一家公司一个岗位就会有很多的开发者投递,在那么多开发者中你如何让面试官很深的认识你,给面试官一个很深的印象,能让他在技术水平差不多的情况的下第一个想起的是你。
从这篇文章对整个面试中所问到的问题进行梳理,查缺补漏。

Activity:
当面试官问你什么Activity,你是不是会觉得一阵懵* ?

在日常应用中,Android是用户交互的接口,他提供了一个界面,让用户进行点击,各种滑动操作等。

Activity的四种状态:
running / paused / stopped / killed
running:点击屏幕,屏幕做出响应,处于activity栈顶的状态
paused:失去焦点不能进行操作,或者是一个透明的在栈顶的Activity,注意并不是被销毁了啊,它的成员信息和变量都还在,当然还有另外一种状态,当内存紧张的时候会北回收掉
stopped:当一个Activity被另外一个Activity完全覆盖的时候,被覆盖的那个处于stopped状态,不可见,成员信息和变量都还在,如果内存紧张也是会被回收的
killed:已经被系统回收

生命周期:
启动:onCreate >> onStart >> onResume
点击HOME键回到主界面:onPause >> onStop
再次回到远Activity:onResrart>>onStart >> onResume
退出当前Activity:onPause >> onStop >> onDestroy

进程优先级:
前台 / 可见 /服务 /后台 / 空
前台:正在进行交互的Activity或者与前台activity绑定的services
可见:一个activity可见但并处于前台,不能点击
服务:在后台开启的服务
后台:当一个Activity被点击home键,退居后台,没有=被回收
空 :不属于前面四种进程的任意一种,处于缓存的目的而保留

启动模式:
standard / singletop / singletask / singleinstance

如何配置Activity的启动模式?
直接在AndroidManifest.xml配置的android:launchMode属性为以上四种之一即可

standrd:标准模式,每次启动都会重新创建一个activity实例加入到任务栈中,不会考虑是不是有此实例存在,不会复用,消耗内存资源

singletop :栈顶复用模式,只检测任务栈栈顶,只有在栈顶的Activity不会被创建,就算是在第二位也是会被创建

singletask:栈内复用模式,也是一个单例模式,检测整个任务栈,如果有并把在之上的实例全部移除掉,回掉onNewIntent方法

singleinstance:一个activity如果在整个系统中只存在一个实例,而且这个activity独享整个任务栈

应用场景:
singleTop:适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人,另外,singleTop启动模式适合于一些不常用的Activity页面,比如“找回密码”、“设置界面”等。

singleTask:最典型的样例就是应用中展示的主页(Home页),假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

singleInstance:比如说,使用微信调起自己的客户端某个页面,不做任何处理的情况下,按下回退或者当前Activity.finish(),页面不会停留在自己的客户端而是返回到微信的客户端页面。但是如果这个页面的启动模式设置为singleTask,当按下返回键或者Activity。finish(),页面都会停留在自己的客户端(因为自己的Application回退栈不为空),这明显不符合逻辑的。产品的要求是,回退必须回到微信客户端,而且要保证不杀死自己的Application.因此,显然其他的其他的启动模式都不具备这个功能。

scheme(sigeimo)跳转协议:
android中的scheme是一种页内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便的在app内部跳转到各个界面;通过scheme协议,服务器可以定制化告诉app跳转到哪个页面,可以通过通知栏消息栏定制化跳转页面,也可以通过H5页面中定义连接跳转指定的activity页面等

应用场景:
1 服务端下发一个url路径,客户端根据下方的路径跳转到指定界面
2 从H5跳转到App内
3 App根据url挑战到另外的一个App

Fragment:
三个小问题看你能完美解答几个
1 Fragment为什么被称为第五大组件?
2 Fragment的生命周期 ?
3 Fragment之间的通信 ?

1 Fragment为什么被称为第五大组件?
首先Fragment的使用频率并不低于其他四大组件,他有自己的生命周期,同时可以动态灵活的加载到Activity中,所以说Fragment可以被称为第五大组件

加载到Activity的两种方式:
1)添加Fragment到Activity的布局文件当中,也叫静态加载,name属性哦
2)动态的在activity中添加fragment ,也叫动态加载
步骤:
FragmentManage用来管理所有要启动的fragment,并用FragmentTransaction添加和替换相对应的fragment,并用容器资源来作为标志位来设置fragment所要显示到activity当中的位置,最后提交commit方法

FragmentPageAdapter与FragmentStatePageAdapter的区别?
1 FragmentStatePageAdapter适合界面多,FragmentPageAdapter适合界面少
2 FragmentStatePageAdapter比FragmentPageAdapter更节省内存
源码分析:
FragmentPageAdapter适用于页面较少的情况下,因为只对ui分离并没有回收内存, 因为源码里面destoryItem是detach方法()只是对fragment和activity的ui脱离开来,并不回收内存
FragmentStatePageAdapter用于界面较多的情况下,界面多也就意味着更加的消耗内存,FragmentStatePageAdapter在每次切换fragment的时候,他是回收内存的,因为源码里面destoryItem的remove方法真正的释放的内存

Fragement的生命周期:
onAttach >> onCreate >> onCreateView >> onActivityCreated >>onStart >> onResume >> onPause >> onStop >> onDestoryView >> onDestory >>onDetach
很显然你要是像背书似的将上面的生命周期说一遍,你认为你跟其他的竞争者有什么优势?

你应该将Activity与Fragment的生命周期结合起来说:
首先,调用Activity的onCreate方法
当Fragment创建的时候会执行onAttach,是在Activity与fragment关联之后调用的
在之后执行onCreate方法,也就是在fragment创建的时候调用,注意,此时的activity还没有创建完毕
在调用fragment的onCreateView方法,系统首次绘制用户界面的时候调用
调用fragment的onActivityCreated方法,也就是activity被渲染绘制成功后调用,
现在是要调用activity的onStart的方法,当activity可见之后调用,
fragment的onStart方法,表示fragment也可见了
接着调用activity的onResume的方法,表示当前activity可以与用户交互了,当activity可见之后调用
fragment的onResume方法,表示当前fragment也可以与用户进行交互操作了,以上步骤完成了从创建到交互的所有步骤

在之后,Fragment的onPause
Activity的onPause
Fragment的onStop
Activity的onStop
现在来到了Frament的onDestoryView方法,表示当前fragment不在被使用,界面销毁,紧接着来到onDestory方法,表示fragment已经销毁了,最后调用onDetach来解除与activity的联系
最后调用Activity的onDestory方法
未完待续

猜你喜欢

转载自blog.csdn.net/liu3364575/article/details/80208293