Android面试__Android基础
Android面试
Activity
Activity生命周期
-
activity的4种状态
running(可见可交互)/paused(失去焦点)/stopped(不可见不可交互)/killed(被系统回收)
-
activity生命周期分析
Activity启动 -> onCreate() -> onStart() -> onResume()
点击Home键回到主界面(Activity不可见)-> onPause() -> OnStop()
当我们再次回到原Activity时 -> onRestart() -> onStart() -> onResume()
退出当前Activity时 -> onPause() -> onStop() -> onDestroy() -
android进程优先级
前台进程/可见进程/服务进程/后台进程/空进程
android任务栈
activity启动模式
- standard:默认
- singletop:栈顶复用,onNewIntent()会被调用
- singletask:栈内复用,onNewIntent()会被调用
- singleinstance:只有一个实例,独享任务栈
scheme跳转协议
android中的scheme是一种页面内跳转协议,应用场景:
- 服务端下发一个url路径,客户端根据此路径,跳转到相应的页面
- 从H5页面跳转到相应app的activity
- app根据url跳转到另一个app
Fragment
Fragment为什么被成为第五大组件
-
Fragment为什么被成为第五大组件
使用频率高,并且有声明周期,想必activity更节省内存,UI切换效果也更加舒适。
-
Fragment加载到Activity的两种方式
- 静态加载。添加到Fragment到Activity的布局文件当中,作为xml的标签
- 动态加载。动态在activity中添加fragment
-
FragmentPagerAdapter与FragmentStatePagerAdapter的区别
FragmentPagerAdapter适用于页面较少的情况,FragmentStatePagerAdapter适用于页面较多的情况。
FragmentStatePagerAdapter源码中的destoryItem()方法是调用了Fragment事务管理器的remove(),释放了Fragment所占的内存;FragmentPagerAdapter的destoryItem()内则调用了Fragment事务管理器的detach(),只是将Fragment与Activity分离,并不回收内存
Fragment生命周期
与Activity生命周期的联系:
onAttach()
onCreate():用于创建Fragment
onCreateView():绘制Fragment UI
onViewCreated():Fragment UI已绘制好,可以初始化Fragment里的控件资源
Fragment通信
- 在Fragment中调用Activity中的方法getActivity()
- 在Activity中调用Fragment中的方法 使用接口回调
- 在Fragment中调用Fragment中的方法 首先通过getActivity(),然后调用findFragmentById()
Fragment的replace、add、remove方法
Service
Service是什么?
是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。不能做耗时操作!!
service和Thread的区别
- Thread程序执行的最小单元,相对独立,service的运行依托于它所 在的主线程,轻量级的IPC通信。
- 他们之间没有任何关联,android中后台与子线程是不同的概念,android的后台指完全不依赖于UI线程,即使activity被销毁了,服务进程仍然存在运行;service不能做耗时操作
- 应用场景上,当需要去访问网络、文件查询,都应开启子线程去操作,避免UI阻塞;而service主要是用来长时间在后台运行,而不需要交互的情况下,如后台播放音乐、天气预报的统计
可参考:https://blog.****.net/mynameishuangshuai/article/details/51821662
service的启动方式
-
startService()
注意onStartCommand()的返回值,START_STICKY:系统因内存不足杀死service,一段时间内存充足后,会重新启动该service
bindService()
BroadcaseReceiver
广播
- 广播定义
在android中,broadcast是一种广泛运用的在应用程序之间传输信息的机制,android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。
广播的场景
同一app具有多个进程的不同组件之间的消息通信
不同app之间的组件之间消息通信
-
广播的种类
- Normal Broadcast:Context.sendBroadcast
- System Broadcast:Context.sendOrderedBroadcast
- Local Broadcast:只在自身App内传播
实现广播-receiver
- 静态注册:注册完成就一直运行
- 动态注册:跟随activity的生命周期
内部实现机制
- 自定义广播接收者BroadcastReceiver,并复写onReceive()方法;
- 通过Binder机制(android进程间通信的核心,整体架构是C/S结构,)向AMS(Activity Manager Service,负责四大机制的启动、切换、调度)进行注册;
- 广播发送者通过Binder机制向AMS发送广播;
- AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BraodcastReceiver(一般情况 下是Activity)相应的消息循环队列中;
- 消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法
LocalBroadcastManager详解
- 使用它发送的广播将只有在自身App内传播,因此不必担心泄漏隐私数据
- 其他App无法对你的App发送该广播,因为你的App根本就不可能接收到非自身应用发送的广播,因此你不必担心有安全漏洞可以利用
- 比系统的全局广播更加高效
LocalBroadcastManager源码分析
- LocalBroadcastManager高效的原因主要是因为它内部是通过Handler实现的,它的sendBroadcast()方法含义并非和我们平时所用的一样,他的sendBroadcast()方法其实是通过handler发送一个Message实现的。
- 既然它内部是通过Handler来实现广播发送,那么相比与系统广播通过Binder实现,那肯定是更高效了,同时使用Handler来实现,别的应用无法向我们的应用发送该广播,而我们应用内发送的广播也不会离开我们的应用
- LocalBroadcastManager内部协作主要是靠这两个Map集合:mReceivers和mActions,当然还有一个List集合mPendingBroadcasts,这个主要就是存储待接收的广播对象
Webview
Webview常见的一些坑
- Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavaScriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法
- webview在布局文件中的使用:webview写在其他容器中时,如在LinearLayout中动态添加WebView,OnDestory()时,一定要先remove掉LinearLayout中的WebView,然后再调用WebView的removeAllViews()和destory()方法,才能真正销毁WebView,避免内存泄漏
- jsbridge
- webviewClient.onPageFinished -> WebChromeClient.onProgressChanged(优先选择)
- 后台耗电
- Webview硬件加速导致页面渲染问题,解决办法是设置暂时关闭WebView硬件加速
参考:https://blog.****.net/hytfly/article/details/48489251
关于WebView的内存泄露问题
原因:WebView关联Activity,而WebView内部执行的操作在一个新的线程中,Activity的生命周期与新线程的生命周期是不一样的,导致了WebView持有Activity的引用,无法回收
解决:
- 独立进程,简单暴力,不过可能设计到进程间通信
- 动态添加WebView,对传入WebView中使用的Context使用弱引用,动态添加WebView,意思是在布局创建一个ViewGroup用来放置WebView,Activity创建时add进来,在Activity停止时remove掉
Binder
Linux内核的基础知识
- 进程隔离/虚拟地址空间
- 系统调用
- binder驱动
Binder通信进制介绍
-
为什么使用binder
- Android使用的Linux内核拥有着非常多的跨进程通信机制
- 性能
- 安全
-
binder通信模型
- 通信录:binder驱动
- 电话基站:ServiceManager
客户端持有服务端的代理,通过代理协助驱动完成了跨进程通信。
- binder通信机制原理
到底什么是bindr!!! - 通常意义下,Binder指的是一种通信机制
- 对于Server进程来说,Binder指的是Binder本地对象;对于Client来说,Binder指的是Binder代理对象
- 对于传输过程而言,Binder是可以进行跨进程传递的对象
AIDL
Binder机制的应用