- android 4大组件
https://blog.csdn.net/ican87/article/details/21874321 - activity生命周期
Activity 类中定义了 7 个回调方法,覆盖了 Activity 生命周期的每一个环节,这 7 种方法除了 onRestart() 方法,其他都是两两相对的。
onCreate():
当 Activity 第一次创建时会被调用,在此方法中应当完成初始化工作,比如加载布局、绑定事件等。
onRestart():
表示 Activity 正在重新启动,一般情况下,当当前 Activity 从不可见重新变为可见状态时,onRestart 就会被调用。
onStart():
表示 Activity 正在被启动,即将开始,这时 Activity 已经出现了,但是还没有出现在前台,无法与用户交互。
onResume():
表示 Activity 已经可见了,并且出现在前台并开始活动。需要和 onStart() 对比,onStart() 的时候 Activity 还在后台,onResume() 的时候 Activity 才显示到前台。
onPause():
表示 Activity 正在停止,仍可见,正常情况下,紧接着 onStop() 就会被调用;在特殊情况下,如果这个时候快速地回到当前 Activity,那么 onResume() 就会被调用(极端情况);onPause() 执行一定要速度快,不然会影响到新的栈顶活动的使用,所以不能进行耗时操作。
onStop():
表示 Activity 即将停止,不可见,位于后台。可以做稍微重量级的回收工作,同样不能太耗时。
onDestory():
表示 Activity 即将销毁,这是 Activity 生命周期的最后一个回调,可以做一些回收工作和最终的资源回收,之后 Activity 的状态将变为销毁状态。 - 横竖屏切换(API13之后)
https://blog.csdn.net/xiewenhao12/article/details/79282590
API13之前并不清楚,没有用过
我知道如何防止重新被加载
android:configChanges=”screenSize|keyboardHidden|orientation”
下面是不同configChanges的生命周期的变化
1、不设置Activity的android:configChanges,或设置Activity的android:configChanges=”orientation”,或设置Activity的android:configChanges=”orientation|keyboardHidden”,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。2、配置 android:configChanges=”orientation|keyboardHidden|screenSize”,才不会销毁 activity,且只调用 onConfigurationChanged方法。1
2
3
4
5
6
7
811-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onPause
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onSaveInstanceState
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onStop
11-02 20:19:00.268 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onDestroy
11-02 20:19:00.318 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onCreate - orientation
11-02 20:19:00.338 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onStart
11-02 20:19:00.338 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onRestoreInstanceState
11-02 20:19:00.338 13324-13324/com.ys.yoosir.screenconfigchange D/MainActivity: -- onResume - Android View绘制流程
https://cloud.tencent.com/developer/article/1745688
measure测量:为测量宽高过程,如果是ViewGroup还要在onMeasure中对所有子View进行measure操作。
layout布局:用于摆放View在ViewGroup中的位置,如果是ViewGroup要在onLayout方法中对所有子View进行layout操作。
draw绘制:往View上绘制图像。
一共有三种测量模式:
UNSPECIFIED :父布局不会对子View做任何限制,例如我们常用的ScrollView就是这种测量模式。
EXACTLY :精确数值,比如使用了match_parent或者xxxdp,表示父布局已经决定了子View的大小,通常在这种情况下View的尺寸就是SpacSize
AT_MOST :自适应,对应wrap_conte nt子View可以根据内容设置自己的大小,但前提是不能超出父ViewGroup的宽高。 - OOM(System.gc)
4.1 java.lang.OutOfMemoryError: Java heap space ——>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
4.2 java.lang.OutOfMemoryError: PermGen space ——>java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
4.3 java.lang.StackOverflowError ——> 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。
4.4 遇到的问题和解决办法:
图片处理;
编码方式;
调整图片大小。
可以在manifest里面加入这个缓解一下:android:largeHeap=“true” 512, 我忘记常规的heap了,好像是192.
治标不治本,一旦出现oom,即使使用了largeheap发现不再出现oom,也不代表你的应用就万事大吉了,可能只是在这个测试用例里面能够成功运行。但是一旦再出现更大的情况,还是会出现OOM。
我也尝试过catch过OOM,但是我时候也想了一下,catch又有什么用呢?报错都已经报错了。也就是说在我这个应用里面,这种大图片就是处理不了。catch只是抓住了这个oom,但我并没有实际办法可以解决这个OOM. - java 堆(heap先进先出)和栈(stack先进后出)
堆内存:new一个对象或者创建一个数组
堆heap内存占据了虚拟机的大部分内存空间,程序执行时产生的对象就分配在堆heap内存上。
如果是堆heap内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
栈内存:基本类型的变量和对象的引用变量
栈stack是存储方法调用的一片内存数据区。 - ANR Application Not Responding;也就是应用程序无响应
InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。
Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
ContentProvider Timeout :ContentProvider的publish在10s内没进行完。
解决办法:
尽量避免在主线程(UI线程)中作耗时操作。耗时的操作放在子线程。
避免死锁的出现
文件读写或数据库操作放在子线程异步操作。 - http协议
get / post / put / delete - 网络协议
1.application layer
http https
2.transport layer
TCP UDP
3.network layer
路由选择,堵塞控制
4.link layer
封装
5.physic layer - Android申请权限
manifest里面加安全的权限
不安全的权限看看有没有,没有问user要 - Activity 异常情况下的生命周期
1.系统配置数据改变导致 Activity 销毁并重创:例如横竖屏的切换时
2.资源内存不足,导致 优先级低的 Activity 被杀.但是Task 和 Activity 栈以及相应的 Intent 和数据会被系统保存起来,在应用程序被切回前台时,均会被恢复。 - 新的 Activity 执行完后需要返回到启动它的 Activity 来执行的回调函数
startActivityResult() - Android 常用控件
TextView、按钮 Button、内容编辑 EditText、ImageView、进度条 ProgressBar、警告框 AlertDialog、进度提示框 ProgressDialog 等等 - Android布局和布局优化
UI 卡顿产生原因:
在 UI 线程中做了轻微的耗时操作;
布局 Layout 过于复杂,无法在 16ms 内完成渲染;
同一时间执行动画次数过多,导致 CPU 与 GPU 负载过重;
View 频繁触发 Measure 与 Layout;
频繁触发 GC 操作,导致线程暂停。
UI 卡顿的优化策略:
布局 Layout 优化;
RecyclerView 优化;
图片优化;
避免 ANR。 - RecyclerView和ListView的区别
ListView 的布局比较单一,只有一个纵向效果;
RecyclerView 的布局效果丰富
RecyclerView中可以实现局部刷新
Android面试
Author: Sheng Wang
Permalink: https://shengwang.fun/2022/11/30/androidinterviewq/
License: Copyright (c) 2019 CC-BY-NC-4.0 LICENSE