Android面试总结

2019-06-16  本文已影响0人  请叫我女程序员

1.Service总结

定义
service 是能在后台执行长时间操作而不提供用户界面的组件,属于四大组件之一(ps:运行于主线程,因此不能进行耗时操作,除非独立开启子线程)

生命周期
❤ 生命周期简介

❤ 使用 startService() 方式启动的生命周期:onCreate() - onStartCommond() - onDestory()
❤ 使用 onBind() 方式启动的生命周期:onCreate() - onBind() - onUnbind() - onDestory()

启动方式
两种启动方式:Context.startService(),Context.bindService()

❤ Context.startService()

❤ Context.bindService()

❤ 两种启动方式结合使用

Activity 与 Service 的交互
❤ 只在绑定服务和解绑服务时传递数据

  1. 创建 Service 时,创建内部类继承 Binder,添加相应的方法,可接受需要的参数,并声明该类,在重写的 onBind() 方法中 return 该属性值 ;
  2. 创建类继承 ServiceConnection 并重写 onServiceConnected() 和 onServiceDisconnected() ;
  3. 在调用bindService() 方法时传入以上参数,则在绑定和解绑服务时会回调重写的方法,并调用相关逻辑 ;

❤ 在服务执行过程中进行交互
可采用两种方式:

  1. 在创建的 Service 中新建接口,并声明相应的 set 方法,在需要的位置进行接口的方法调用;
  2. 在启用 Service 的类中实现相应的接口,重写必要的方法,进行数据传递

Service 是否能进行耗时操作
Service 是执行在主线程中,不能进行耗时操作,除非手动开启一个子线程

如何保证 Service 不被杀死

2.BroadcastReceiver 广播

类型

广播的注册方式,异同
广播分为静态注册和动态注册

3.Activity 启动模式

4.Java四种引用类型:强引用,软引用,弱引用,虚引用

强引用

eg: Object a = new Object();
只有当 a 被释放的时候 a 才能被回收

软引用

eg:

  • SoftReference sr = new SoftReference(new String("abc"));
    ps:上边代码表示只有软引用,当被回收后 sr.get() 返回 null;
  • String a = new String("abc"); -- 强引用
    SoftReference sr = new SoftRefrence(a); --软引用
    ps:若内存不足时,sr 会被回收,此时 sr.get() 返回 null , a为强可达对象,只剩强引用
    若手动 a = null;此时 sr为软可达对象,只剩软引用持有,在 sr 被回收前仍可通过软引用获取相应数据

弱引用

eg: WeakReference wr = new WeakReference(new String("abc"));
引用方法可参考上边软引用

虚引用

eg: ReferenceQueue rq = new ReferenceQueue();
String a = new String("abc");
PhantomReference pr = new PhantomReference(a,rq);

5.App 的启动过程

涉及到的类

App 的启动流程
准备:Zygote 在启动是会创建 SystemService 进程,该进程中运行着 ActivityManagerService(AMS),AMS 启动 Launcher,Zygote 稳定后等待 AMS 发送消息来创建相应的进程
当用户点击桌面图标时
a.Launcher 通过 Binder 向 AMS 发送一条要启动一个 Activity 的请求;
b.AMS 通过 Binder 告知 Launcher 进入 Pause 状态;
c.Launcher 通过 Binder 告知 AMS 已进入 Pause 状态;
d.AMS 通过 socket 通讯告知 Zygote 创建新 App 的进程;
e.Zygote 去检查是冷启动还是热启动,是否要新创建进程,用来启动一个 ActivityThread 实例,供新启动的 Activity 运行;
f.ActivityThread 创建 ApplicationThread 并通过 Binder 通讯将一个 ApplicationThread 的 Binder 传递给 AMS,便于后期通讯;
g.AMS 通过 Binder 通知 ActivityThread 一切准备就绪可以启动Activity;

6.UI 优化

a.合理选择 RelativeLayout,LinearLayout,FrameLayout
 RelativeLayout 和 FrameLayout 会让子 View 调用两次 onMeasure,当布局很复杂时效率会比较低;LinearLayout 在 weight > 0 时也会调用两次 onMeasure;
b.使用标签
 <include/>布局重用,<merge/>减少布局层级,<ViewStub/>需要使用,可减少一些加载时不可见的布局的实例化,提升效率
c.减少布局层级
 可以通过手机开发者选项>GPU 过度绘制查看层级,一般控制在4层以内
d.自定义 View
 重写 onDraw 方法时,不要在该方法中新建对象,容易引起 GC
e.ListView 的使用
 注意布局重用,并使用 Holder,减少布局重绘和 findViewById 的次数
f.去除不必要的背景
 getWindow().setBackgroundDrawable(null)
g.TextView的使用
 使用 leftDrawable 代替 ImageView + TextView

7.内存优化

a.读取文件资源时及时关闭
b.加载图片时注意使用缓存机制
c.使用内部类时注意使用 静态内部类 + 弱引用的方式防止内存泄漏
d.使用线程池管理线程,避免线程的重复创建消耗资源
e.在使用单例时若有 context 的引用,注意要及时释放,或者引用 ApplicationContext
f.使用 webview 时在 onDestory 方法里要及时移除和销毁,webview.removeAllViews() 和 webview.destory()
g.使用属性动画,在界面销毁时要将属性动画置空
h.使用 LeakCanary 等工具进行内存监测

8.OkHttp 原理解析

涉及到的类

.属性动画

.自定义空间

-组合控件

-绘制

-自定义viewgroup

. String,StringBuffer,StringBuilder的区别

. 简述JNI

. 简述TCP,UDP,Socket

. 进程和线程的区别

. 线程池

.java 虚拟机的实现机制

.okhttp 的源码分析

.Sqlite 数据库

.java 的回收机制

.hotFix 原理

.常用的线程通信,以及异同

.事件分发机制,onTouchListener和onClickListener的执行顺序

.如何保障Service不被杀死,如何保证进程不被杀死

.sp原理,能否跨进程,如何实现

.

上一篇 下一篇

猜你喜欢

热点阅读