安卓笔记
关于进程顺序
重要性依次是:前台进程,可见进程,服务进程,后台进程和空进程;所以销毁的顺序是逆方向。
前台进程(foreground): 目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。 我们最不希望终止的进程就是前台进程。
可见进程(visible): 可见进程是一些不在前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)
次要服务(secondary server): 目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止
后台进程(hidden): 虽然用了hidden这个词,但实际即是后台进程(background),就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点 内容供应节点(content provider): 没有程序实体,仅仅提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权 空进程(empty): 没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。 这部分进程无疑是应该最先终止的。 补充: 系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个进程;(系统会根据“oom_adj”来判断需要结束哪些进程,一般来说,“oom_adj”的值越大,该进程被系统选中终止的可能就越高) 前台程序的“oom_adj”值为0,这意味着它不会被系统终止,一旦它不可访问后,会获得个更高的“oom_adj”,推测“oom_adj”的值是根据软件在LRU列表中的位置所决定的; Android不同于Linux,有一套自己独特的进程管理模块,这个模块有更强的可定制性,可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。这给了进程管理脚本的编写以更多的选择。
-
前台进程
用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:
- 托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)
- 托管某个 Service,后者绑定到用户正在交互的 Activity
- 托管正在“前台”运行的 Service(服务已调用 [startForeground()](https://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)))
- 托管正执行一个生命周期回调的 Service(onCreate()、[onStart()](https://developer.android.com/reference/android/app/Service.html#onStart(android.content.Intent, int)) 或 onDestroy())
- 托管正执行其 [onReceive()](https://developer.android.com/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context, android.content.Intent)) 方法的 BroadcastReceiver
通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。
-
可见进程
没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:
- 托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
- 托管绑定到可见(或前台)Activity 的 Service。
可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
-
服务进程
正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。
-
后台进程
包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。 有关保存和恢复状态的信息,请参阅 Activity文档。
-
空进程
不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
java中的运行异常, 检查非检查异常
运行异常:编译器直接抛出的异常
非检查异常:必须用try catch来进行抛出的异常, 主要涉及IO相关,数据库连接相关的异常;
运行异常包括:
Runtime Exception主要包括以下这些:
ArithmeticException, 算术异常
ArrayStoreException, 将数组类型不兼容的值赋值给数组元素时抛出的异常
BufferOverflowException, 缓冲区溢出异常
BufferUnderflowException, 缓冲区下溢异常
CannotRedoException, 不能重复上一次操作异常
CannotUndoException, 不能撤销上一次操作异常
ClassCastException, 类型强制转换异常
ClassNotFoundException 类没找到时,抛出该异常
CMMException, CMM异常
ConcurrentModificationException, 对 Vector 、ArrayList在迭代的时候如果同时对其进行修改就会抛出异常 org.springframework.jdbc.CannotGetJdbcConnectionException 服务器端数据库连接不上时,抛出该异常 CannotGetJdbcConnectionException 网络没有连接或网络中断
DOMException, DOM异常 EOFException, 文件已结束异常
EmptyStackException, 空栈异常
FileNotFoundException, 文件未找到异常
IllegalArgumentException, 传递非法参数异常
IllegalMonitorStateException, IllegalAccessException, 访问某类被拒绝时抛出的异常
IllegalPathStateException, 非法的路径声明异常
IllegalStateException, 非法声明异常
ImagingOpException, 成像操作异常
IndexOutOfBoundsException, 下标越界异常
IOException, 输入输出异常
NegativeArraySizeException, 数组负下标异常
NoSuchMethodException 在类中无法找到某一特定方法时,抛出该异常
NoSuchElementException, 方法未找到异常
NoSuchFieldException 类不包含指定名称的字段时产生的信号(bean中不存在这个属性 ) NumberFormatException, 字符串转换为数字异常
NullPointerException, 空指针异常
ProfileDataException, 没有日志文件异常
ProviderException, 供应者异常
RasterFormatException, 平面格式异常
SecurityException, 违背安全原则异常
SQLException, 操作数据库异常
SystemException, 系统异常
UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException, 不支持的操作异常
夸进程的方式
1.访问其他应用程序的Activity
2.Content Provider
3.广播(Broadcast)
4.AIDL服务
安卓的动画分类
Android的 动画分为3种,具体如下所示:
-
帧动画:也就是我们说的 Frame 动画。 Frame 动画是一系列图片按照一定的顺序展示的过程,和放电影的机制相似,它的原理是在一定的时间段内切换多张有细微差异的图片从而达到动画的效果。由于是一帧一帧加载,所以需要较多的图片。从而增大 APK 的大小,不过 Frame 动画可以实现一些比较难的效果,例如:等待的环形进度。 所涉及到的 Java 对象有: AnimationDrawable 。
-
补间动画:也就是 Tween 动画,是操作某一个控件让其展现出旋转、渐变、移动、缩放的一种转换过程。是一种视觉上的变化,不是真正位置上的变化。只能运用在 View 对象上,并且功能相对来说较为局限。例如:旋转动画只能够在 x 、 y 轴进行,而不能在 z 轴放心进行旋转。因此,补间动画通常用于执行一些比较简单的动画。 所涉及到的 Java 对象有: AlphaAnimation (渐变动画)、 ScaleAnimation (缩放动画)、 TranslateAnimation (位移动画)、 RotateAnimation (旋转动画)。
-
属性动画:是 Android 3.0 之后推出的,其机制不再是针对 View 来设计的,也不限于只能实现移动、缩放、旋转和淡入这几种简单的动画操作,同时也不再只是一种视觉上的动画效果。属性动画实际上是一种在一定时间段内不断修改某个对象的某个属性值的机制。 所涉及到的 Java 对象有: ValueAnimator 、 ObjectAnimator 。
GLSurfaceView**是一个视图,
-
继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
GLSurfaceView提供了下列特性:
1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。
Intent/Bundle 支持传递:
1) 基本类型的数据和基本类型的数组数据
2) String/CharSequence 类型的数据和 String/CharSequence 类型的数组数据
3) 传递 Parcelable (包裹化,邮包)和 Serializable (序列化)类型的数据,以及它们的数组/列表数据】
ps:file对象继承于Serializable数据
anr原因
- 前台进程,input五秒
- 广播超过10S会造成ANR
- service 20s没有处理完成
安卓中Style的写法
标签嵌套是resources>style>item
安卓中的架构分层
Android数据持久化有五种方式:
1、SharedPreferences
2、内部存储(例如通过openFileOutput()打开一个文件输入输出流)
3、SQLite Database
4、网络连接(将数据存储到服务器上)
5、外部存储(SD卡)
Parcelable和Serializable 俩者异同
1、Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
2、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
3、Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
安卓中获得屏幕属性
获取屏幕密度 getScreen
获取设备屏幕大小 getDisplay
获得屏幕的属性,从而取得屏幕的高度和宽度 getMetrics
获得window对象 getWindows
安卓中短信相关的权限
短信相关权限
GLSurfaceView
GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
GLSurfaceView提供了下列特性:
1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。
安卓NDK
https://www.jianshu.com/p/0261e6cceb3e
RadioButton和CheckBox的区别:
1、单个RadioButton在选中后,通过点击无法变为未选中
单个CheckBox在选中后,通过点击可以变为未选中
2、一组RadioButton,只能同时选中一个
一组CheckBox,能同时选中多个
3、RadioButton在大部分UI框架中默认都以圆形表示
CheckBox在大部分UI框架中默认都以矩形表示
RadioButton和RadioGroup的关系:
1、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器
2、每个RadioGroup中的RadioButton同时只能有一个被选中
3、不同的RadioGroup中的RadioButton互不相干,即如果组A中有一个选中了,组B中依然可以有一个被选中
4、大部分场合下,一个RadioGroup中至少有2个RadioButton
5、大部分场合下,一个RadioGroup中的RadioButton默认会有一个被选中,并建议您将它放在RadioGroup中的起始位置
Activity四种状态:
1、running
2、paused
3、stopped
4、killed