为什么很多程序员面试造火箭,入职拧螺丝?

知乎截图

前言

这种现象很正常,因为找一个程序员,当然希望他能做的业务越多越好,最好像机器猫一样,啥事儿都能搞定。然而,目前正在做的业务并没有扩张到那么大的规模,可能刚加入团队的时候,只能帮老员工打打下手,这在大厂里很常见。

但是,大厂团队一旦接到需求,确定要扩张业务,行动起来就是倾其全力,全军冲锋,这种时候,平时积淀的“造火箭”的“屠龙术”就有用武之地。如果没有这样的技术积淀,根本抓不住战机,等别人做出来了,自己的团队还没做出来,或者根本用不了,黄花菜都凉了。

谁能尽快搞定高精尖难的业务,谁就能当上领导。ali的双十一并发难题、12306的春运抢票难题,这些需求猛,规模大的业务,都得靠平时不会轻易去用的,从底层原理开始设计、改进的技术,靠工程师们一步步逼近性能极限、优化用户体验来实现。

只有提高自身的学习动力、学习毅力、学习能力,通过学习力的提高为创新提供源泉,不断飞跃,不断发展。在这个知识爆炸的社会,学习的速度要大于知识变更的速度,只有这样,才能不被社会淘汰。只有通过坚持不懈的学习,拓宽自己的思路,改变对事物的看法,改变自己的主观认识,辨证、全面的看待问题,提升自己的人生价值、理想和抱负,用真心渴望实现的目标来激励自己。下面为大家准备了**Android中高级专题的领取方式“加入交流群”,希望大家可以查漏补缺,提升自己。**

1、Activity生命周期?

onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

2、Service生命周期?

service 启动方式有两种,一种是通过startService()方式进行启动,另一种是通过bindService()方式进行启动。不同的启动方式他们的生命周期是不一样.

通过startService()这种方式启动的service,生命周期是这样:调用startService() --> onCreate()–> onStartConmon()–> onDestroy()。这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),onCreate()方法也只会被调用一次,而onStartConmon()会被多次调用当我们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当我们通过startService启动时候,通过intent传值,在onStartConmon()方法中获取值的时候,一定要先判断intent是否为null。

通过bindService()方式进行绑定,这种方式绑定service,生命周期走法:bindService–>onCreate()–>onBind()–>unBind()–>onDestroy()  bingservice 这种方式进行启动service好处是更加便利activity中操作service,比如加入service中有几个方法,a,b ,如果要在activity中调用,在需要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承Binder对象

3、Activity的启动过程(不要回答生命周期)

app启动的过程有两种情况,第一种是从桌面launcher上点击相应的应用图标,第二种是在activity中通过调用startActivity来启动一个新的activity。

我们创建一个新的项目,默认的根activity都是MainActivity,而所有的activity都是保存在堆栈中的,我们启动一个新的activity就会放在上一个activity上面,而我们从桌面点击应用图标的时候,由于launcher本身也是一个应用,当我们点击图标的时候,系统就会调用startActivitySately(),一般情况下,我们所启动的activity的相关信息都会保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackaManagerService的管理服务,这个管理服务会对AndroidManifest.xml文件进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件的信息。当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法最终还是会调用startActivityForResult()这个方法。而在startActivityForResult()这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然最后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用。

4、Broadcast注册方式与区别

此处延伸:什么情况下用动态注册

Broadcast广播,注册方式主要有两种.

第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。

第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露

广播是分为有序广播和无序广播。

5、HttpClient与HttpUrlConnection的区别 
6、java虚拟机和Dalvik虚拟机的区别 
7、进程保活(不死进程)
8、讲解一下Context 
9、理解Activity,View,Window三者关系
10、四种LaunchMode及其使用场景
11、View的绘制流程
12、View,ViewGroup事件分发
13、保存Activity状态
14、Android中的几种动画
15、Android中跨进程通讯的几种方式
16、AIDL理解
17、Handler的原理
18、Binder机制原理
19、热修复的原理
20、Android内存泄露及管理
21、Fragment与Fragment、Activity通信的方式
22、Android UI适配
23、app优化
24、图片优化
25、HybridApp WebView和JS交互
26、JAVA GC原理
27、ANR的产生原因及解决方法
28、设计模式
29、MVP,MVC,MVVM
30、RecyclerView和ListView的区别
31、Universal-ImageLoader,Picasso,Fresco,Glide对比
32、Xutils, OKhttp, Volley, Retrofit对比

资料截图.png

资料截图.png
面试资料截图.png

只看到自己在拧螺丝的人,无论当初热情再怎么大,终有一天会厌倦。

而为了造火箭而拧螺丝的人,总能够在僵硬和机械重复的执行流程当中,渐渐地找到改变和突破口,并最终进入到职场的金字塔尖端。

最后

———————祝大家前程似锦offer不断

Guess you like

Origin blog.csdn.net/weixin_47933729/article/details/116945677