记的之前有次有个朋友去腾讯面试,前面可以说是一路畅通,结果最后倒在了一些常问的基础知识点的细节上,才觉得细节决定成败,回来后一起把很多能用到的点整理了出来。整整983页的PDF
对此很多面试中遇到的问题,花了15个小时整理成为了一份983页的PDF文档。
需要的可以联系我领取完整的PDF
更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取
一. 腾讯
三轮面试
一面
- 算法题
- Android 沉浸式状态栏 怎么实现的
- 事件处理函数有哪几个,父View 子View 监听同一个事件,重写哪些方法。在哪个View重写?
- ViewRootImpl接受事件吗?
- apk编译打包流程 V1,V2 签名区别
- 利用logging监听方法耗时,会不会让app增大延迟。
- eventbus为什么要用CopyOnWriteList?
- 插件化怎么加载资源的?
- JVM怎么保证gc效率跟线程运行效率的 ?
- 如果android没用对应的view,flutter能运行吗? 手写单例模式,volatile 跟 synchronized区别?
- 接口暴露,但是不让别人调用,有哪些办法?
二面
- 为什么采用flatbuffer? 比Json好在哪里?
- 如何处理Crash,NativeCrash呢?Google是怎么做到的?如果上报过程中再次产生Crash能不能捕捉到?
- uncaughtException是被谁调用的,如果再次崩溃能不能捕获到?
- Linux是怎么知道app崩溃的,如果想要在被kill前 做一些耗时操作,该怎么做?
- 考虑设计一个crash捕捉模块。
- 100万个数字求100个最大值。
- 手写快速排序算法。
三面 (GM面)
- kotlin比Java好在哪里,是函数式编程吗?
- 如何防止DNS劫持?
- 如果让你实现一个调试器,你会怎么设计?静态调试?动态调试呢?
我觉得进大厂不仅仅技术要过关,更看重思路与抽象的解决方案
二. Android面试常问基础知识点细节篇
1、四大组件的生命周期和简单用法
1)Activity :onCreate()
->onStart()
->onResume()
->onPause()
->onStop()
->onDestory()
onCreate()
:为Activity设置布局,此时界面还不可见;
onStart()
: Activity可见但还不能与用户交互,不能获得焦点
onRestart()
: 重新启动Activity时被回调
onResume()
: Activity可见且可与用户进行交互
onPause()
: 当前Activity暂停,不可与用户交互,但还可见。在新Activity启动前被系统调用保存现有的Activity中的持久数据、停止动画等。
onStop()
: 当Activity被新的Activity覆盖不可见时被系统调用
onDestory()
: 当Activity被系统销毁杀掉或是由于内存不足时调用
2)Service
a) onBind
方式绑定的:onCreate
->onBind
->onUnBind
->onDestory
(不管调用bindService
几次,onCreate只会调用一次,onStart不会被调用,建立连接后,service会一直运行,直到调用unBindService或是之前调用的bindService的Context不存在了,系统会自动停止Service,对应的onDestory会被调用)
b) startService
启动的:onCreate
->onStartCommand
->onDestory
(start多次,onCreate
只会被调用一次,onStart
会调用多次,该service会在后台运行,直至被调用stopService
或是stopSelf
)
**c)**又被启动又被绑定的服务,不管如何调用onCreate()
只被调用一次,startService
调用多少次,onStart
就会被调用多少次,而unbindService
不会停止服务,必须调用stopService
或是stopSelf
来停止服务。必须unbindService
和stopService(stopSelf)
同时都调用了才会停止服务。
3)BroadcastReceiver
a) 动态注册:存活周期是在Context.registerReceiver
和Context.unregisterReceiver
之间,BroadcastReceiver
每次收到广播都是使用注册传入的对象处理的。
b) 静态注册:进程在的情况下,receiver会正常收到广播,调用onReceive
方法;生命周期只存活在onReceive
函数中,此方法结束,BroadcastReceiver
就销毁了。onReceive()
只有十几秒存活时间,在onReceive()
内操作超过10S,就会报ANR
。
进程不存在的情况,广播相应的进程会被拉活,Application.onCreate
会被调用,再调用onReceive
。
4)ContentProvider
应该和应用的生命周期一样,它属于系统应用,应用启动时,它会跟着初始化,应用关闭或被杀,它会跟着结束。
2、Activity之间的通信方式
1)通过Intent方式传递参数跳转
2)通过广播方式
3)通过接口回调方式
4)借助类的静态变量或全局变量
5)借助SharedPreference
或是外部存储,如数据库或本地文件
3、横竖屏切换的时候,Activity 各种情况下的生命周期
1)切换横屏时:onSaveInstanceState
->onPause
->onStop
->onDestory
->onCreate
->onStart
->onRestoreInstanceState
->onResume
2) 切换竖屏时:会打印两次相同的log
onSaveInstanceState
->onPause
->onStop
->onDestory
->onCreate
->onStart
->onRestoreInstanceState
->onResume
->onSaveInstanceState
->onPause
->onStop
->onDestory
->onCreate
->onStart
->onRestoreInstanceState
->onResume
3) 如果在AndroidMainfest.xml
中修改该Activity的属性,添加android:configChanges
="orientation
"
横竖屏切换,打印的log一样,同1)
4) 如果AndroidMainfest.xml
中该Activity中的android:configChanges
="orientation|keyboardHidden
",则只会打印onConfigurationChanged
->
4、Activity与Fragment之间生命周期比较
Fragment生命周期:onAttach
->onCreate
->onCreateView
->onActivityCreated
->onStart
->onResume
->onPause
->onStop
->onDestoryView
->onDestory
->onDetach
切换到该Fragment:onAttach
->onCreate
->onCreateView
->onActivityCreated
->onStart
->onResume
按下Power键:onPause
->onSaveInstanceState
->onStop
点亮屏幕解锁:onStart
->onRestoreInstanceState
->onResume
切换到其他Fragment: onPause
->onStop
->onDestoryView
切回到该Fragment: onCreateView
->onActivityCreated
->onStart
->onResume
退出应用:onPause
->onStop
->onDestoryView
->onDestory
->onDetach
5、Activity上有Dialog的时候按Home键时的生命周期
AlertDialog
并不会影响Activity的生命周期,按Home键后才会使Activity走onPause
->onStop
,AlertDialog
只是一个组件,并不会使Activity进入后台。
6、两个Activity 之间跳转时必然会执行的是哪几个方法?
前一个Activity的onPause
,后一个Activity的onResume
7、前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。
1) 前台切换到后台,会执行onPause
->onStop
,再回到前台,会执行onRestart
->onStart
->onResume
2) 弹出Dialog,并不会影响Activity生命周期
8、Activity的四种启动模式对比
1)standard:标准启动模式(默认),每启动一次Activity,都会创建一个实例,即使从ActivityA startActivity
ActivityA
,也会再次创建A的实例放于栈顶,当回退时,回到上一个ActivityA
的实例。
2) singleTop:栈顶复用模式,每次启动Activity,如果待启动的Activity位于栈顶,则不会重新创建Activity的实例,即不会走onCreate
->onStart
,会直接进入Activity的onPause
->onNewIntent
->onResume
方法
3) singleInstance: 单一实例模式,整个手机操作系统里只有一个该Activity实例存在,没有其他Actvity
,后续请求均不会创建新的Activity。若task中存在实例,执行实例的onNewIntent()
。
应用场景:闹钟、浏览器、电话
4) singleTask:栈内复用,启动的Activity如果在指定的taskAffinity
的task栈中存在相应的实例,则会把它上面的Activity都出栈,直到当前Activity实例位于栈顶,执行相应的onNewIntent()
方法。如果指定的task不存在,创建指定的taskAffinity
的task,taskAffinity
的作用,进入指写taskAffinity
的task,如果指定的task存在,将task移到前台,如果指定的task不存在,创建指定的taskAffinity
的task.
应用场景:应用的主页面
9、Activity状态保存于恢复
Activity被主动回收时,如按下Back键,系统不会保存它的状态,只有被动回收时,虽然这个Activity实例已被销毁,但系统在新建一个Activity实例时,会带上先前被回收Activity的信息。在当前Activity被销毁前调用onSaveInstanceState(onPause
和onStop
之间保存),重新创建Activity后会在onCreate
后调用onRestoreInstanceState
(onStart
和onResume
之间被调用),它们的参数Bundle用来数据保存和读取的。
保存View状态有两个前提:View的子类必须实现了onSaveInstanceState
; 必须要设定Id,这个ID作为Bundle的Key
10、fragment各种情况下的生命周期
11、Fragment状态保存onSaveInstanceState是哪个类的方法,在什么情况下使用?
12、Fragment.startActivityForResult
是和FragmentActivity
的startActivityForResult
?
13、如何实现Fragment的滑动?
ViewPage
r+FragmentPagerAdapter
+List<Fragment>
14、fragment之间传递数据的方式?
15、service和activity怎么进行数据交互?
1)通过bindService
启动服务,可以在ServiceConnection
的onServiceConnected
中获取到Service的实例,这样就可以调用service的方法,如果service想调用activity的方法,可以在service中定义接口类及相应的set方法,在activity中实现相应的接口,这样service就可以回调接口言法;
2)通过广播方式
16、说说ContentProvider、ContentResolver、ContentObserver 之间的关系
17、在manifest 和代码中如何注册和使用BroadcastReceiver?
18、AlertDialog,popupWindow,Activity区别
19、Application 和 Activity 的 Context 对象的区别
更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取