Android面试题

1.Activity的生命周期?

onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

2.Service生命周期?

方式一:通过startService()这种方式启动的Service
startService() -> onCreate() -> onStartCommand() -> onDestroy()

注意事项:

  1. 多次调用startService(),onCreate()方法只会被调用一次,onStartConmon()会被多次调用。
  2. 调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。
  3. 通过intent传值,在onStartCommand()方法中获取值的时候,一定要先判断intent是否为null。

方式二:通过bindService()方式进行绑定Service
bindService -> onCreate() -> onBind() -> unBind() -> onDestroy()

注意事项:

  1. 如果要在Activity中调用Service中的方法,则需要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象调用类中的方法,当然这个类需要继承Binder对象。

3.Fragment的生命周期?

onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroyView()

4.Activity的启动过程?

  1. 从桌面launcher上点击相应的应用图标.
  2. 在activity中通过调用startActivity来启动一个新的activity。

5.Broadcast注册方式、类型、区别?

广播是分为有序广播和无序广播。

  1. 静态注册,常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
  2. 动态注册,非常驻型广播,受到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄露。

6.进程的优先级?

优先级从高到低:

  1. 前台进程 (Foreground process)
  2. 可见进程 (Visible process)
  3. 服务进程 (Serviceprocess)
  4. 后台进程 (Background process)
  5. 空进程 (Empty process)

7.Android进程保活手段?

  1. 黑色保活 :不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
  2. 白色保活 :启动前台Service
  3. 灰色保活 :利用系统的漏洞启动前台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.自定义控件的方式?

  1. 组合控件: 这种自定义控件不需要我们自己绘制,而是使用原生控件组合成的新控件。如标题栏。
  2. 继承原有的控件: 这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。
  3. 完全自定义控件: 这个View上所展现的内容全部都是我们自己绘制出来的。比如说制作水波纹进度条。

12.View的绘制流程?

OnMeasure() -> OnLayout() -> OnDraw()

13.如何保存Activity状态?

onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用,也就是onStop()方法之前,onPause方法之后被调用。

14.Android中的几种动画?

  1. 帧动画: 指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。
  2. 补间动画: 指通过指定View的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha、Scale、Translate、Rotate四种效果。注意:只是在视图层实现了动画效果,并没有真正改变View的属性,比如滑动列表,改变标题栏的透明度。
  3. 属性动画: 在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。

15.Android中跨进程通讯的几种方式?

  1. Intent:这种跨进程方式并不是访问内存的形式,它需要传递一个uri,比如说打电话。
  2. ContentProvider:使用数据共享的形式进行数据共享。
  3. Service:远程服务,AIDL。
  4. Broadcast

16.待续。。。