Android面试题
安卓面试题
1.Activity的生命周期?
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
2.Service生命周期?
方式一:通过startService()这种方式启动的Service
startService() -> onCreate() -> onStartCommand() -> onDestroy()
注意事项:
- 多次调用startService(),onCreate()方法只会被调用一次,onStartConmon()会被多次调用。
- 调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。
- 通过intent传值,在onStartCommand()方法中获取值的时候,一定要先判断intent是否为null。
方式二:通过bindService()方式进行绑定Service
bindService -> onCreate() -> onBind() -> unBind() -> onDestroy()
注意事项:
- 如果要在Activity中调用Service中的方法,则需要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象调用类中的方法,当然这个类需要继承Binder对象。
3.Fragment的生命周期?
onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroyView()
4.Activity的启动过程?
- 从桌面launcher上点击相应的应用图标.
- 在activity中通过调用startActivity来启动一个新的activity。
5.Broadcast注册方式、类型、区别?
广播是分为有序广播和无序广播。
- 静态注册,常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
- 动态注册,非常驻型广播,受到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄露。
6.进程的优先级?
优先级从高到低:
- 前台进程 (Foreground process)
- 可见进程 (Visible process)
- 服务进程 (Serviceprocess)
- 后台进程 (Background process)
- 空进程 (Empty process)
7.Android进程保活手段?
- 黑色保活 :不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
- 白色保活 :启动前台Service
- 灰色保活 :利用系统的漏洞启动前台Service
8.讲解一下你对Context的理解
getApplicationContext() 和 getApplication()方法得到的对象都是同一个application对象,只是对象的类型不一样。
Context数量 = Activity数量 + Service数量 + 1 (1为Application)
9.说说Activity,View,Window三者关系
Activity 像一个工匠 ( 控制单元 ),Window 像窗户 ( 承载模型 ),View 像窗花( 显示视图 ) LayoutInflater 像剪刀,Xml 配置像窗花图纸。
10.说说四种LaunchMode及其使用场景
standard 模式
默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
11.自定义控件的方式?
- 组合控件: 这种自定义控件不需要我们自己绘制,而是使用原生控件组合成的新控件。如标题栏。
- 继承原有的控件: 这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。
- 完全自定义控件: 这个View上所展现的内容全部都是我们自己绘制出来的。比如说制作水波纹进度条。
12.View的绘制流程?
OnMeasure() -> OnLayout() -> OnDraw()
13.如何保存Activity状态?
onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用,也就是onStop()方法之前,onPause方法之后被调用。
14.Android中的几种动画?
- 帧动画: 指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。
- 补间动画: 指通过指定View的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha、Scale、Translate、Rotate四种效果。注意:只是在视图层实现了动画效果,并没有真正改变View的属性,比如滑动列表,改变标题栏的透明度。
- 属性动画: 在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。
15.Android中跨进程通讯的几种方式?
- Intent:这种跨进程方式并不是访问内存的形式,它需要传递一个uri,比如说打电话。
- ContentProvider:使用数据共享的形式进行数据共享。
- Service:远程服务,AIDL。
- Broadcast
16.待续。。。
本文地址:https://blog.csdn.net/weixin_43266090/article/details/107300183
推荐阅读