第3章 Android基础相关面试题
1、Activity问题讲解
a) Activity的生命周期
1.Activity的4种状态
running / paused / stopped / killed
running:activity处于活动状态,用户可以点击屏幕,屏幕做出响应,此时该activity处于栈顶
paused:activity失去焦点,用户不能点击,或者被一个非全屏activity占据、透明界面放入栈顶
stopped:当该activity被完全覆盖
killed:被android系统回收
2.Activity的生命周期
Activity启动->onCreate()->onStart()->onReasume()
点击Home键回到主界面(Activity不可见)->onPause()->onStop()
当我们再次回到原activity时->onRestart()->onStart()->onReasume()
退出当前activity时->onPause()->onStop()->onDestroy()
3.Android进程优先级
前台进程:正在前台和用户交互的activity或者是和前台activity绑定的service
可见进程:处于前台但是用户不能点击
服务进程:在后台开启一个服务
后台进程:前台进程点击hone键后就变成了后台进程
空进程:不属于前面四种进程,android系统随时可以杀掉
b) Android的任务栈
c) Activity启动模式
standard 标准模式:默认的启动模式
singleTop 栈顶复用模式:须要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity。不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样
singleTask 栈内复用模式:若须要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。
singleInstance 单实例模式:SingleInstance比較特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。
d) Scheme跳转协议
Android中的Scheme是一种页面内跳转协议,通过自定义Scheme协议,可以跳转到app中的任何页面。
服务器可以定制化跳转app页面
app可以通过Scheme跳转到另一个app页面
可以通过h5页面跳转app原生页面
协议格式
Uri.parse("qh://test:8080/goods?goodsId=8897&name=fuck")
qh代表Scheme协议名称
test代表Scheme作用的地址域
8080代表改路径的端口号
/goods代表的是指定页面(路径)
goodsId和name代表传递的两个参数
Scheme使用
http://blog.csdn.net/lishuiyuntian/article/details/77477756
2、Fragment问题讲解
a) Fragment为什么会被称为第五大组件
b) Fragment加载到Activity中的两种方式
1.静态加载
xml方式
2.动态加载
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.collapseActionView,new Fragment()); fragmentTransaction.commit();
c) FragmentPageAdapter与FragmentStatePageAdapter区别
FragmentPageAdapter适用于界面较少的情况
FragmentStatePageAdapter适用于界面较多的情况
看源码中的destroyItem函数发现FragmentStatePageAdapter在Viewpage切换界面的时候会真正的回收内存,而FragmentPageAdapter不会
d) Fragment的生命周期
e) Fragement之间的通信
1.Fragemnt调用Activity中的方法
通过getActivity() 方式
2.Activity调用Fragment中的方法
接口回掉
3.Fragment调用Fragment中的方法
/*通过findFragmentById获取Fragment*/ fragment = (MyFragment) manager.findFragmentById(R.id.fragment1);
4. Fragment的replce、add、remove分别是什么作用,replace 和 add方法有什么区别
replace:替换Fragment的栈顶页面
add:添加Fragment到栈顶页面
remove:移除Fragement栈顶页面
3、Service问题讲解
a) Service的应用场景,以及和thread的区别
1. Service是什么?
2. Service和Thread的区别
b) 开启Service的俩中方式以及区别?
1.startService
2.bindService
4、broadcast问题讲解
a) 广播
1.广播的定义
2.广播的场景
3.广播的种类
普通广播(Normal Broadcast):sendBroadcast()
系统广播(System Broadcast)
有序广播(Ordered Broadcast):sendOrderedBroadcast()
粘性广播(Sticky Broadcast)
App 应用内广播(Local Broadcast )
1.注册广播时将exported属性设置为false,使得非本App内部发出的此广播不被接收;
2.在广播发送和接收时,增设相应权限permission,用于权限验证;
3.发送广播时指定该广播接收器所在的包名,此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。
b) 实现广播
c) 广播实现机制
1.自定义广播接收者BroadcastReceiver,并重写onReceiver()方法
2.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册
3.广播发送者通过binder机制向AMS发送广播;
4.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
5.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法
d)LocalBroadcastManager详解
1.因广播数据在本应用范围内传播,你不用担心隐私数据泄露的问题
2.不用担心别的应用伪造广播,造成安全隐患。
3.相比在系统内发送全局广播,它更高效。
LocalBroadcastManager 核心实现实际还是 Handler,因为是 Handler 实现的应用内的通信,这就可以理解上述所说的三个优点,本APP通信、不受非本APP广播影响、效率高,并且无法跨进程通信。
5、webview安全漏洞问题讲解
a)webview常见的一些坑
1. webview 在android api16以及之前版本的安全漏洞,该漏洞是因为程序没有正确的限制webview.addjavascriptinterface方法,让远程攻击者可以使用java的反射机制利用该漏洞执行任意的java对象方法。
2. webview动态添加到其他布局的时候,在activity销毁的生命周期时,需要主动调用webview.removeallviews和webview的ondestory方法释放内存,否则会导致内存泄漏。
3.jsbridge ,js桥可以允许远程网页端与android的native端进行通信,通俗的说就是使用js桥可以在android代码中调用网页的js方法,也可以让js调用原生的代码
4. webview.onpagefinished方法,该方法并不靠谱,按照api上面的说法,在web页面完全加载完成的时候会回调该方法,但在实际应用过程中,该方法在跳转url的时候会被多次调用,更加靠谱的方法是使用onprogresschange方法代替该方法的功能,当newProgress为100的时候,即是页面加载完成。
5. 后台耗电问题,webview加载网页的时候,会自动创建线程,如果如果使用不当,这些线程会永远在后台运行,导致你的应用耗电量居高不下,这个问题的解决方式是在activity的ondetory方法中销毁webview。
6. webview硬件加速导致渲染问题,比如加载的时候会有闪屏现象,解决方式就是暂时关闭硬件加速。
7. webview导致内存溢出的原因,主要是因为内部类持有外部类的引用导致外部类无法释放的问题。
6、binder问题讲解
a) Linux内核的基础知识
进程隔离/虚拟地址空间
b) Binder通信机制介绍
为什么要使用binder
Android使用的Linux内核拥有着非常多的跨进程通信机制
性能
安全
Binder通信模型
通信录:binder驱动
电话基站:serviceManager
Binder通信机制原理
http://blog.csdn.net/freekiteyu/article/details/70082302
c) AIDL的实现
AIDL(Android Interface Define Language) 是IPC进程间通信方式的一种.