一、Activity生命周期
1、Activity的四种状态
running:Activity处于栈顶状态,当前正在运行的界面
pause:Activity失去焦点,失去与用户交互的能力,状态信息和内存还在,除非内存不够
stopped:Activity不可见,完全被覆盖,内存不紧张的时候,状态还在
killed:Activity被销毁
2、Activity生命周期
Activity启动->onCreate()->onStart()(可见)->onResume(获取焦点)
返回主界面,(Activity不可见)->onPause(失去焦点)->onStop(不可见)
当再次回到原Activity->onReStart()->onStart()->onResume()
退出当前Activity->onPause(失去焦点)->onStop(不可见)->onDestory()
3、Android进程优先级
前台、可见、服务、后台、空
前台进程:用户可见并且可以点击
可见进程:可见但是不能点击
服务进程service开启的一个进程
后台进程:比如一前台进程,我们按下home键,这时前台进程就变成了后台进程
空进程:不属于以上四种进程,可以随时被系统杀掉
二、Activity启动模式
standard:每创建一个Activity都会去新建Activity,而不会去考虑是否已经存在或者复用
singleTask:判断新的Activity是否存在于栈内,如果存在,那么直接复用,并且移除他之上的所有Activity
singleTop(栈顶复用):如果新的Activity位于栈顶,那么复用栈顶,不再新建
singleInstance:在系统中只有一个实例,单独位于一个任务栈
三、Scheme跳转协议
Android中Scheme是一种页面内跳转协议,通过自定义Scheme协议,可以跳转到APP中的任何界面
服务器可以定制化跳转APP界面
APP可以通过Scheme跳转到另一个APP界面
可以通过H5页面跳转到APP原声界面
URL Scheme应用场景分为以下4中:
服务器下发跳转路径,客户端根据 服务器下发跳转路径跳转相应的页面
H5页面点击描点,根据描点具体跳转路径APP端跳转具体的页面
APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
APP根据URL跳转到另外一个APP指定页面
//协议格式
Uri.parse("qh://test:8080/goods?goodsId=8897&name=fuck")
qh代表Scheme协议名称
test代表Scheme作用的地址域
8080代表改路径的端口号
goods代表的是指定页面(路径)
goodsId和name代表传递的两个参
//调用方式
Intent intent1 = new Intent(Intent.ACTION_VIEW, Uri.parse("qh://test:8080/goods?goodsId=8897&name=fuck"));
startActivity(intent1);
四、FragmentPageAdapter和FragmentStatePageAdapter
在Android中,对于fragment比较常用的情况是viewpager嵌套Fragment,我们在使用Fregment的适配器的时候,有两种使用方式,一个是FragmentPageAdapter,另一个是FragmentStatePageAdapter,那么两者区别是什么呢,我们看源码便能发现,FragmentStatePageAdapter的destroy方法中对fragment的处理是remove,而FragmentPageAdapter则是detach,detach并没有销毁fragment,只是分离开来,而FragmentStatePageAdapter是回收内存,所以使用的时候,当fragment比较多的时候,我们应该使用FragmentStatePageAdapter,较少则使用FragmentPageAdapter
五、BroadcastReceiver面试相关
1、BroadcastReceiver内部实现机制
1、自定义广播接收者BroadcastReceiver,然后重写onRecvice()方法
2、通过Binder机制向AMS进行注册
//(Binder机制:Android进程间通信的核心,整体架构属于C/S模式,客户端获取数据,通过接口将数据传输到服务端)
//(Activity Manager Service:整个APP的组件的核心服务,负责启动四大组件以及应用程序的调动,可以启动广播)
3、广播发送者通过Binder机制向AMS发送广播
4、AMS收到广播后通过IntentFilter,查找相应的BroadcastReceiver,将广播发送到BroadcastReceiver进行消息循环
5、消息循环拿到广播后,回调到BroadcastReceiver的onReceive()方法
2、LocalBroadcastManager详解
1、使用普通的广播相当于跨进程通讯,有可能别人反编译我们的APP,找到了我们广播的action,然后自己去发同样的广播来做一些不安全的事情,所以,鉴于考虑,才会使用LocalBroadcastManager,这种广播只在APP内部传播,不受外界的影响,因此是安全的高效的
2、LocalBroadcastManager高效的原因是内部源码中可以看到使用handler实现的,他的sendbroadcast其实是利用handler发送一个消息,而我们所用的系统广播主要是用Binder实习的,效率慢一些;
3、LocalBroadcastManager内部主要是这两个hashMap:mReceeivers和mActions,还有一个存储待接收广播的对象的集合mPendingBroadcasts;
六、Webview面试相关
1、API16以及之前的版本存在漏洞,使用webview的addJavscripInterface方法的时候,攻击着可以通过反射操作本地的Java接口,不是很安全
2、webview被动态添加到布局文件中,在activity销毁的时候,先remove掉webview在布局中,否则会造成内存泄漏
3、当我们需要在webview中操作或者跳转很多网页的时候,我们最好是使用WebChromeClient.onProgressChangge,而不是使用webvieewClient.onPageFinished
4、当webview加载的时候,会在后台开启几个线程,我们退出当前activity的时候,最好然后在onDestroy中先回收webview对象
5、webview硬件加速导致界面渲染问题,只能暂时关闭加速
6、解决webview导致内存泄漏问题,webview开的线程运行在activity中,activity不能确定线程的生命周期,有可能导致内存泄漏,时候可以开一个独立进行操作webview,退出的时候杀死进程防止内存泄漏