Android面试整理,附答案

Android

基础

1. 四大组件是什么?

Activity,Service,BroadcastReceiver,Content Provider

2. Activity 的生命周期?

在这里插入图片描述

4. Activity 之间的通信方式?

Intent
借助类的静态变量
借助全局变量/Application
借助外部工具
– 借助SharedPreference
– 使用Android数据库SQLite
– 赤裸裸的使用File
– Android剪切板
借助Service
接口回调

5. Activity 各种情况下的生命周期?

Situation1:

正常启动: onCreate() → onStart() → onResume();

返回健退出: onPause() → onStop() → onDestory();

Situation2:

正常启动 : onCreate() → onStart → () onResume();

按home健: onPause() → onStop();

正常启动:onRestart() → onStart() → onResume();

Situation3:

正常启动:onCreate() → onStart() → onResume();

横竖屏切换: onPause() → onStop() → onDestory() → onCreate() → onStart() → onResume();

Situation4:

前提条件:Activity的AndroidManifest.xml中设置android:configChanges="orientation|keyboardHidden|screenSize”

正常启动:onCreate() → onStart() → onResume();

横竖屏切换: onConfigurationChanged();

6. 横竖屏切换时 Activity 的生命周期

横竖屏切换时Activity生命周期变化解析

7. 前台切换到后台,然后再回到前台时 Activity 的生命周期

onPause()->OnStop()->OnStart()->OnResume()
如果是透明背景的桌面,比如AndroidTV开发中VisibleBehind时,GMS Launcher背景半透明,视频在背后播放,此时onPause()->OnStart()
除此之外还有PIP(PictureInPictureMode)模式下,也是不会走到OnStop(),页面处于onPause状态。

8. 弹出 Dialog 的时候按 Home 键时 Activity 的生命周期

有没有Dialog没有区别,Dialog可以当做是Activity的组件

. 正常启动: onCreate() -> onStart() -> onResume()
2. 按 home 键: onPause() -> onStop()
3. 再次启动: onRestart() -> onStart() -> onResume()

9. 两个 Activity 之间跳转时的生命周期

两个Activity的生命周期会交互在一起
假设有两个Activity,activityA和activityB
由A跳转到B时
A onPause()->B onStart()->A OnStop()->B -> OnResume()

10. 下拉状态栏时 Activity 的生命周期

下拉状态栏时对Activity没有影响,不会触发Activity的生命周期变化。

11. Activity 与 Fragment 之间生命周期比较?

在这里插入图片描述

12. Activity 的四种 LaunchMode(启动模式)的区别?

1.standard :Activity的默认启动模式,每次跳转系统都会在task中生成一个新的FirstActivity实例,并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的FirstActivity实例。不管有没有已存在的实例,都生成新的实例。
2.singleTop:如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。
3.singleTask:如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。
4.singleInstance:启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。

13. Activity 状态保存与恢复?

1、保存activity状态

  • 保存activity状态,onSaveInstanceState这个方法会自动保存有ID的组件的状态

  • 没有ID的组件或者变量的状态的保存就需要我们重写这个方法

  • 这个方法是在activity被回收或者被销毁的时候保存的,比如横竖屏幕的切换等等

2、恢复activity状态

  • 恢复activity状态
  • onRestoreInstanceState方法会自动恢复有ID的或者说之前onSaveInstanceState保存的状态
  • 我们自己重写的保存内容要我们自己恢复
  • 这个方法在页面创建的时候自动运行
  • 所以自然也可以把恢复状态的代码写在onCreate方法里面

14. Fragment 各种情况下的生命周期?

在这里插入图片描述
在这里插入图片描述

15. Activity 和 Fragment 之间怎么通信, Fragment 和 Fragment 怎么通信?

Activity 传值给 Fragment:通过 Bundle 对象来传递,Activity 中构造 bundle 数据包,调用 Fragment 对象的 setArguments(Bundle b) 方法,Fragment 中使用 getArguments() 方法获取 Activity 传递过来的数据包取值。

Fragment 传值给 Activity:在 Fragment 中定义一个内部回调接口,Activity 实现该回调接口, Fragment 中获取 Activity 的引用,调用 Activity 实现的业务方法。接口回调机制式 Java 不同对象之间数据交互的通用方法。

Fragment 传值给 Fragment:一个 Fragment 通过 Activity 获取到另外一个 Fragment 直接调用方法传值。

15. Service 的生命周期?

在这里插入图片描述
1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。

2). 被绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。

3). 被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。

4). 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。

16. Service 的启动方式?

1.通过 startService() 来启动
一旦服务开启跟开启者就没有任何关系;
开启者退出之后,服务还是可以在后台长期运行的。前提是没有调用 stopService(Intent);
开启者不能调用服务里面的方法
2.通过 bindService() 来启动
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法。

17. Service 与 IntentService 的区别?

IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

18. Service 和 Activity 之间的通信方式?

  • 通过 Binder 对象
  • 通过 Broadcast(广播)的形式

19. 对 ContentProvider 的理解?

ContentProvider详解

20. ContentProvider、ContentResolver、ContentObserver 之间的关系?

ContentProvider:

四大组件的内容提供者,主要用于对外提供数据

实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等

一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。

ContentResolver:

内容解析者,用于获取内容提供者提供的数据

ContentResolver.notifyChange(uri)发出消息

ContentObserver:

内容监听器,可以监听数据的改变状态

目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObsever也分为表ContentObserver、行ContentObserver,当然这是与它所监听的Uri MIME Type有关的

ContentResolver.registerContentObserver()监听消息

联系:

简单一句话来描述就是:使用ContentResolver来获取ContentProvider提供的数据,同时注册

21. 对 BroadcastReceiver 的了解?

broadcastreceiver全面详解

22. 广播的分类?使用方式和场景?

Broadcast的种类和基本使用

23. 动态广播和静态广播有什么区别?

  • 动态的比静态的安全
  • 静态在 App 启动的时候就初始化了,动态使用代码初始化
  • 静态需要配置,动态不需要
  • 生存期,静态广播的生存期可以比动态广播的长很多
  • 优先级动态广播的优先级比静态广播高

24. AlertDialog、popupWindow、Activity 之间的区别?

AlertDialog、PopupWindow 与 Activity 之间区别

25. Application 和 Activity 的 Context 之间的区别?

context activity application 之间的区别

26. Android 属性动画特性?

详解Android属性动画

27. LinearLayout、RelativeLayout、FrameLayout 的特性对比及使用场景?

LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景

RelativeLayout和LinearLayout及FrameLayout性能分析

28. 对 SurfaceView 的了解?

谈谈对SurfaceView的理解

29. Serializable 和 Parcelable 的区别?

Serializable 和 Parcelable 的区别

30. Android 中数据存储方式有哪些?

Android 数据存储五种方式

31. 屏幕适配的处理技巧都有哪些?

Android 屏幕适配:最全面的解决方案

32. Android 各个版本 API 的区别?

Android API版本对照表及各个版本特性简单描述

33. 动态权限适配方案,权限组的概念?

动态权限适配方案,权限组的概念

34. 为什么不能在子线程更新 UI?

为什么不能在子线程中更新UI

35. ListView 图片加载错乱的原理和解决方案?

listview图片加载错乱的原理和解决方案

36. 对 RecycleView 的了解?

RecyclerView

37. Recycleview 和 ListView 的区别?

【Android】ListView和RecycleView的比较区别和各自的性能详述

38. RecycleView 实现原理?

RecyclerView原理分析

39. Android Manifest 的作用与理解?

AndroidManifest.xml的意义

40. 多线程在 Android 中的使用?

Android中多线程在程序中的使用

进阶

1. 画出 Android 的大体架构图

在这里插入图片描述
Android的系统架构采用了分层架构的思想,如图1所示。从上层到底层共包括四层,分别是应用层、应用框架层、系统库和Android运行时和Linux内核。
一、应用层
该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。

二、应用程序框架层
该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。

三、系统库和Android运行时
系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.net、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。

四、Linux内核
Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。

2. 低版本 SDK 如何使用高版本 API?

如何在低版本SDK调用高版本API?

3. AsyncTask 如何使用?

Android 多线程:手把手教你使用AsyncTask

4. AsyncTask 机制、原理及不足?

AsyncTask原理及不足

5. 如果在 onStop() 的时候做了网络请求,onResume() 的时候怎么恢复?

//TODO:暂时没找到,过会自己写

6. Handler 机制和底层实现?

handler的原理以及底层的实现

7. Handler、Thread、HandlerThread 区别?

Handler、Thread、HandlerThread三者的区别

8. ThreadLocal 原理、实现及如何保证 Local 属性?

ThreadLocal

9. 自定义 View 的流程?如何机型适配?

Android自定义View以及View的绘制流程

10. 自定义 View 的时候怎么获取 View 的大小?

自定义View 之基础篇——获取控件宽高

11. View 的绘制流程?

Android View 的绘制流程

12. View 的事件传递分发机制?

View的事件传递及分发机制

13. requestLayout(),onLayout(),onDraw(),drawChild() 区别与联系?

requestLayout()与onLayout();onDraw()与drawChild()的区别和联系

14. invalidate() 和 postInvalidate() 的区别?

【Android面试】你造吗?invalidate和postinvalidate有这些区别

15. 如何计算一个 View 的嵌套层级?

循环追寻父类父类,看看有多少,便有多少嵌套层级

while (view.getParents() != null) {
    count++;
    view = view.getParents();
}

16. Android 动画框架及实现原理?

Android 动画框架的基本原理

17. 进程和 Application 的生命周期的关系?

进程和 Application 的生命周期

18. SpareArray 的实现原理?

SparseArray实现原理

19. SharedPreferences 的实现原理?是否进程同步?如何做到同步?

SharePreference原理及跨进程数据共享的问题

20. ContentProvider 是如何实现数据共享的?

ContentProvider如何实现APP之间的数据共享

21. ContentProvider 的权限管理?

Content Provider的权限

22. Android 系统为什么会设计 ContentProvider?

ontentProvider应用程序间非常通用的共享数据的一种方式,也是Android官方推荐的方式。Android中许多系统应用都使用该方式实现数据共享,比如通讯录、短信等。

设计用意在于:

封装。对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在DB,XML、Preferences或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。
提供一种跨进程数据共享的方式。
就是数据更新通知机制了。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这样它们就可以作相应的处理。

ContentResolver接口的notifyChange函数来通知那些注册了监控特定URI的ContentObserver对象,使得它们可以相应地执行一些处理。ContentObserver可以通过registerContentObserver进行注册。

ContentProvider和调用者在同一个进程,ContentProvider的方法(query/insert/update/delete等)和调用者在同一线程中;
ContentProvider和调用者在不同的进程,ContentProvider的方法会运行在它自身所在进程的一个Binder线程中。

23. Android 线程有没有上限?

没限制,硬件资源够就成。但是方法数是有上限的65535,可以使用64k分包解决方案
android 方法数越界问题 65536/64k(方法数超过65535)

24. 怎么去除重复代码?

去除重复代码、减少重复代码?

25. Android 中开启摄像头的主要流程?

获得摄像头管理器CameraManager mCameraManager,mCameraManager.openCamera()来打开摄像头
指定要打开的摄像头,并创建openCamera()所需要的CameraDevice.StateCallback stateCallback
在CameraDevice.StateCallback stateCallback中调用takePreview(),这个方法中,使用CaptureRequest.Builder创建预览需要的CameraRequest,并初始化了CameraCaptureSession,最后调用了setRepeatingRequest(previewRequest, null, childHandler)进行了预览
点击屏幕,调用takePicture(),这个方法内,最终调用了capture(mCaptureRequest, null, childHandler)
在new ImageReader.OnImageAvailableListener(){}回调方法中,将拍照拿到的图片进行展示

26. 对 Bitmap 对象的了解?

Bitmap对象的理解

27. 图片加载原理?

面试题一天一题 —— 第二天 · (图片加载原理)

28. 图片压缩原理?

采样
android 图片压缩技术 见解

29. 图片框架实现原理?LRUCache 原理?

谈谈LruCache算法的底层实现原理及其内部源码

30. EventBus 实现原理?

EventBus 原理解析

31. ButterKnife 实现原理?

为啥还用ButterKnife,databinding它不香吗?
https://www.jianshu.com/p/003be1b75e28

32. Volley 实现原理?

这玩意还有人用??
Volley 原理解析

33. okhttp 实现原理?

OKHttp3原理分析

34. 服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达?

//TODO:没找到,待会自己写

35. SQLite 数据库升级,数据迁移问题?

用GreenDao就好了,用realm直接放弃sqlite更好
sqlite升级–浅谈Android数据库版本升级及数据的迁移

36. 数据库框架对比和源码分析?

Android数据库ORM框架用法、源码和性能比较分析

37. CAS介绍,OAuth 授权机制?

[CAS与OAuth2的区别

](https://www.cnblogs.com/boboooo/p/9041355.html)

38. 谈谈你对安卓签名的理解

安卓签名文件的理解和使用

39. App 是如何沙箱化,为什么要这么做?

浅析Android沙箱模型

混合开发

1. 混合开发的方式?各自优缺点和使用场景?

2. Hybird

3. React Native

4. Weex

5. Flutter

6. Dart

7. 快应用

Framework

1. 请介绍一下 NDK?

NDK-介绍

2. 如何在 jni 中注册 native 函数,有几种注册方式?

如何在jni中注册native函数,有几种注册方式?

3. Android 进程分类?

Android进程分类

4. 谈谈对进程共享和线程安全的认识?

谈谈对进程,线程,线程安全和线程状态的理解

5. 谈谈对多进程开发的理解以及多进程应用场景?

多进程场景遇见过么

6. 什么是协程?

Java里没有协程这个概念,但是kotlin有,到时候我补写
什么是协程

7. 逻辑地址与物理地址,为什么使用逻辑地址?

(他娘的Android面试为啥问这个??)

逻辑地址:存储单元的地址可以用段基值和段内偏移量来表示,段基值确定它所在的段居于整个存储空间的位置,偏移量确定它在段内的位置,这种地址表示方式称为逻辑地址。8086体系的CPU一开始是20根地址线, 寻址寄存器是16位, 16位的寄存器可以访问64K的地址空间, 如果程序要想访问大于64K的内存, 就要把内存分段, 每段64K, 用段地址+偏移量的方法来访问 。386CPU出来之后, 采用了32条地址线, 地址寄存器也扩为32位, 这样就可以不用分段了, 直接用一个地址寄存器来线性访问4G的内存了. 这就叫平面模式.

线性地址:又叫虚拟地址,是一个32位无符号整数,可以用来表示高达4GB的地址,跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址则对应了硬件页式内存的转换前地址。

物理地址:用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。

注意:

1.CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线性地址,再利用其页式内存管理单元,转换为最终物理地址。

逻辑地址----段式内存管理单元----线性地址----页式内存管理单元----物理地址

这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程。之所以这样冗余,Intel完全是为了兼容而已。

8. Android 为每个应用程序分配的内存大小是多少?

Android为每个应用程序分配的内存大小是多少

9. 进程保活的方式?

1 Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
2 通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill
3 双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程(传说中的腾讯系阿里系app做法,打个比方QQ被杀了微信会把它重新叫起来,脏啊)
4 QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
5 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)
6 Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影 响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下 (Android5.0以下可行)
1) 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
2)在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。
3) 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
7 联系厂商,加入白名单

10. 系统启动流程是什么?

系统启动流程是什么?

11. 一个应用程序安装到手机上的过程发生了什么?

大体说清一个应用程序安装到手机上时发生了什么

12. App 启动流程,从点击桌面开始(Activity 启动流程)?

app 启动流程

13. 什么是 AIDL?解决了什么问题?如何使用?

Android AIDL使用详解

14. Binder 机制及工作原理?

简单理解Binder机制的原理

15. App 中唤醒其他进程的实现方式?

App中唤醒其他进程的实现方式

Android 利用scheme协议进行跳转

16. Activity、Window、View 三者的关系与区别?

Activity-Window-View三者的关系

17. ApplicationContext 和 ActivityContext 的区别?

ApplicationContext和ActivityContext的区别

18. ActivityThread,ActivityManagerService,WindowManagerService 的工作原理?

Activity ActivityManagerService以及WindowManagerService之间的关系

19. PackageManagerService 的工作原理?

PackageManagerService服务框架详解

20. PowerManagerService 的工作原理?

深入理解PowerManagerService

21. 权限管理系统(底层的权限是如何进行 grant 的)?

permission 的初始化:是指 permission 的向系统申请,系统进行检测并授权,并建立相应的数据结构。
权限检查:Android framework 中提供了一些接口用来对外来的访问(包括自己)进行权限检查 。 这些接口 主要通过 ContextWrapper 提供,具体实现在 ContextImpl 中 。ContextImpl.java 中提供的 API ,其实都是由 ActivityManagerService 中的如下几个接口进行的封装。
其中有一个checkPermission() // 主要用于一般的 permission 检查

checkPermission 的实现分析

如果传入的 permission 名称为 null ,那么返回 PackageManager.PERMISSION_DENIED 。
判断调用者 uid 是否符合要求 。
如果通过 2 的检查后,再 调用 PackageManagerService.checkUidPermission ,判断 这个 uid 是否拥有相应的权限
3.权限校验之后,应给分发了

性能优化

1. 如何对 Android 应用进行性能分析以及优化?

Android App优化之性能分析工具

如何对Android 应用进行性能分析以及优化

2. ANR 产生的原因是什么?怎么定位?

五、ANR产生的原因及其定位分析

3. OOM 是什么?怎么解决?是否可以 try catch?

你车没油了是不是也try catch一下就好了?你怎么不new个油箱出来?
什么是OOM?如何解决OOM问题!

4. 内存泄露的解决方法?

内存泄漏的检测与解决方法

5. ddms 和 traceView 的使用?

DDMS:

DDMS 【Dalvik Debug Monitor Service】是安卓(android)开发环境中的Dalvik虚拟机调试监控服务。

DDMS能够提供:测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等。

TraceView :

Traceview是安卓(android)平台配备的性能分析的工具。

可以通过图形化让了解要跟踪的程序的性能,并且能具体到方法(method)。

DDMS和TraceView的区别:

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,而TraceView是程序性能分析器。

6. 性能优化如何分析 systrace?

Android性能优化之Systrace分析UI性能

7. 用 IDE 如何分析内存泄漏?

Android studio 分析内存泄漏

8. Java 多线程引发的性能问题,怎么解决?

Java多线程引发的性能问题以及调优策略

9. 启动页白屏、黑屏、太慢怎么解决?

把启动页删了
解决Android启动页开启速度慢导致的黑屏白屏现象

10. App 启动崩溃异常怎么捕捉?

定义一个应用异常捕获类AppUncaughtExceptionHandler,它必须得实现Thread.UncaughtExceptionHandler接口,另外还需要重写uncaughtException方法,去按我们自己的方式来处理异常。

在Application中我们只需要初始化自定义的异常捕获类即可:

完成以上过程后,接着需要重写uncaughtException方法:

@Override public void uncaughtException(Thread thread, Throwable ex) {
    if (crashing) {
        return;
    }
    crashing = true;
 
    // 打印异常信息
    ex.printStackTrace();
    // 我们没有处理异常 并且默认异常处理不为空 则交给系统处理
    if (!handlelException(ex) && mDefaultHandler != null) {
    // 系统处理
        mDefaultHandler.uncaughtException(thread, ex);
    }
    byebye();
}
 
private void byebye() {
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(0);
}

11. 如何保持应用的稳定性?

创建一个应用,什么代码都不写,只有一个helloWorld,贼稳定,就没碰到过问题。越简单越可靠。
或者内存,布局优化,代码质量,数据结构效率,针对业务合理的设计框架但是肯定还是没helloWorld稳定。

12. RecyclerView 和 ListView 的性能对比?

RecyclerView和ListView的性能对比

13. Bitmap 如何处理大图?如何预防 OOM?

Android处理大图,如一张30M的大图,如何预防OOM

14. 如何缩小 Apk 的体积?

少写代码少放资源文件,最好只有一个helloWorld
Android 减小APK包体大小方法总结

15. 如何统计启动时长?

Android如何统计app应用启动时长?

Gradle

1. Gradle源码解析

Gradle系列二 – 源码分析

2. 对热修复和插件化的理解?

Android 插件化和热修复知识梳理

3. 插件化原理分析

Android插件化原理解析

4. 模块化实现(好处,原因)

模块化实现(好处,原因)

5. 项目组件化的理解

一次 Android 项目组件化

6. 描述清点击 Android Studio 的 build 按钮后发生了什么?

电脑卡住了
描述清点击 Android Studio 的 build 按钮后发生了什么

Kotlin

1. 谈谈对 Kotlin 的理解

后面再写,睡觉了

2. 闭包和局部内部类的区别?

发布了17 篇原创文章 · 获赞 9 · 访问量 1628

猜你喜欢

转载自blog.csdn.net/weixin_44666188/article/details/103501810