不断学习,做更好的自己!💪
视频号 | CSDN | 简书 |
---|---|---|
欢迎打开微信,关注我的视频号:程序员朵朵 | 点我 | 点我 |
前言
本文主要汇总一些Android 面试的技术点。
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、Broadcast注册方式与区别?
Broadcast广播,注册方式主要有两种.
第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,
这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般
用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,
收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。
这种注册方式优先级较高。最后需要解绑,否会会内存泄露
广播是分为有序广播和无序广播。
4、讲解一下Context?
Context是一个抽象基类。在翻译为上下文,也可以理解为环境,是提供一些程序的运行环境基础信息。
Context下有两个子类,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。
而ContextWrapper又有三个直接的子类, ContextThemeWrapper、Service和Application。
其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,
所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。
Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,
但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,
Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,
比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,
一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。
而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,
我们只能使用Activity类型的Context,否则将会出错。
getApplicationContext()和getApplication()方法得到的对象都是同一个application对象,
只是对象的类型不一样。
Context数量 = Activity数量 + Service数量 + 1 (1为Application)
5、理解Activity,View,Window三者关系?
Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。
1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。
2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。
3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等
4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。
6、四种LaunchMode及其使用场景?
栈与队列的区别:
队列先进先出,栈先进后出
2. 对插入和删除操作的”限定”。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
3. 遍历数据速度不同
standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。
singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
7、Android中的几种动画?
帧动画:指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。
补间动画:指通过指定View的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha、Scale、Translate、Rotate四种效果。注意:只是在视图层实现了动画效果,并没有真正改变View的属性,比如滑动列表,改变标题栏的透明度。
属性动画:在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。
8、Android中跨进程通讯的几种方式?
Android 跨进程通信,像intent,contentProvider,广播,service都可以跨进程通信。
intent:这种跨进程方式并不是访问内存的形式,它需要传递一个uri,比如说打电话。
contentProvider:这种形式,是使用数据共享的形式进行数据共享。
service:远程服务,aidl
广播
9、AIDL理解?
AIDL: 每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,
执行着自己的操作,都在自己的那片狭小的空间里过完自己的一生。而aidl就类似与两个进程之间的桥梁,
使得两个进程之间可以进行数据的传输,跨进程通信有多种选择,比如 BroadcastReceiver ,
Messenger 等,但是 BroadcastReceiver 占用的系统资源比较多,
如果是频繁的跨进程通信的话显然是不可取的;Messenger 进行跨进程通信时请求队列是同步进行的,
无法并发执行。
Binde机制简单理解:
在Android系统的Binder机制中,是有Client,Service,ServiceManager,Binder驱动程序组成的,
其中Client,service,Service Manager运行在用户空间,Binder驱动程序是运行在内核空间的。
而Binder就是把这4种组件粘合在一块的粘合剂,其中核心的组件就是Binder驱动程序,
Service Manager提供辅助管理的功能,而Client和Service正是在Binder驱动程序和
Service Manager提供的基础设施上实现C/S 之间的通信。其中Binder驱动程序提供
设备文件/dev/binder与用户控件进行交互,
Client、Service,Service Manager通过open和ioctl文件操作相应的方法与Binder驱动程序进行通信。
而Client和Service之间的进程间通信是通过Binder驱动程序间接实现的。
而Binder Manager是一个守护进程,用来管理Service,并向Client提供查询Service接口的能力。
10、Fragment与Fragment、Activity通信的方式?
1.直接在一个Fragment中调用另外一个Fragment中的方法
2.使用接口回调
3.使用广播
4.Fragment直接调用Activity中的public方法
11、WebView和JS交互?
Android与JS通过WebView互相调用方法,实际上是:
Android去调用JS的代码
1. 通过WebView的loadUrl(),使用该方法比较简洁,方便。但是效率比较低,获取返回值比较困难。
2. 通过WebView的evaluateJavascript(),该方法效率高,但是4.4以上的版本才支持,4.4以下版本不支持。所以建议两者混合使用。
JS去调用Android的代码
1. 通过WebView的addJavascriptInterfa