Android开发艺术探索阅读笔记(目录)
目录:
第一章 Activity的生命周期和启动模式
- Activity的生命周期全面分析
1.1 activity 典型情况下的生命周期分析
1.2 activity 异常情况下的生命周期分析 - Activity 启动模式
2.1 Activity 的 LauncherMode
2.2 Activity 的 Flags - IntentFilter匹配规则
第二章 IPC机制
- Android IPC简介
- Android中的多进程模式
2.1 开启多进程模式
2.2 多进程模式的运行机制 - IPC基础概念介绍
2.1 Serializable 接口
2.2 Parcelable 接口
2.3 Binder - Android中的IPC方式
4.1 使用Bundle
4.2 使用文件共享
4.3 使用Messenger
4.5 使用AIDL
4.5 使用ContentProvider
4.6 使用Socket - Binder连接池
- 选择合适的IPC方式
第三章 View的事件体系
- View基础知识
1.1 什么是View
1.2 View的位置参数
1.3 MotionEvent和TouchSlop
1.4 VelocityTracker 、GestureDectector 和 Scroller - View的滑动
2.1 使用scrollTo / scrollBy
2.2 使用动画
2.3 改变布局参数
2.4 各种滑动方式的对比 - 弹性滑动
3.1 使用Scroller
3.2 通过动画
3.3 使用延时策略 - View的事件分发机制
4.1 点击事件的传递规则
4.2 事件分发的源码解析 - View的滑动冲突
5.1 常见的滑动冲突场景
5.2 滑动冲突的处理规则
5.3 滑动冲突的解决方式
第四章 View的工作原理
- 初识 ViewRoot 和 DecordView
- 理解MeasureSpec
2.1 MeasureSpec
2.2 MeasureSpec 和 LayoutParams的对应关系 - View的工作过程
3.1 measure过程
3.2 layout过程
3.3 draw过程 - 自定义View
4.1 自定义View的分类
4.2 自定义View须知
4.3 自定义View示例
4.4 自定义View的思想
第五章 理解RemoteViews
- RemoteViews的应用
1.1 RemoteViews在通知栏上的应用
1.2 在桌面小部件上的应用
1.3 PendingIntent概述 - RemoteViews的内部机制
- RemoteViews的意义
第六章 Android Drawable
- Drawable简介
- Drawable 的分类
2.1 BitmapDrawable
2.2 ShapeDrawable
2.3 LayerDrawable
2.4 StateListDrawable
2.5 LevelListDrawable
2.6 TransitionDrawable
2.7 InsertDrawable
2.8 ScaleDrawable
2.9 ClipDrawable - 自定义Drawable
第七章 Android 动画升入分析
- View动画
1.1 View动画的种类
1.2 自定义View动画
1.3 帧动画 - View动画的特殊使用场景
2.1 LayoutAnimation
2.2 Activity的切换效果 - 属性动画
3.1 使用属性动画
3.2 理解插值器和估值器
3.3 属性动画的监听器
3.4 对任意属性做动画
3.5 属性动画的工作原理 - 使用动画注意事项
第八章 理解Window 和 WindowManager
- Window和WindowManager
- Window的内部机制
2.1 Window 的添加过程
2.2 Window 的删除过程
2.3 Window 的更新过程 - Window的创建过程
3.1 Activity的Window创建过程
3.2 Dialog的Window创建过程
3.3 Toast的Window创建过程
第九章 四大组件的工作过程
- 四大组件的运行状态
- Activity的工作过程
- Service的工作过程
3.1 Service的启动过程
3.2 Service的绑定过程 - BroadcastReceiver的工作过程
4.1 广播的注册过程
4.2 广播的发送和接收过程 - ContentProvier的工作过程
第十章 Android 消息机制
- Android的消息机制概述
- Android的消息机制分析
2.1 ThreadLocal的工作原理
2.2 消息队列的工作原理
2.3 Lopper的工作原理
2.4 Handler的工作原理 - 主线程的消息循环
第十一章 Android 的线程和线程池
- 主线程和子线程
- Android中线程的形态
2.1 AsyncTask
2.2 AsyncTask的工作原理
2.3 HandlerThread
2.4 IntentService - Android中的线程池
3.1 ThreadPoolExecutor
3.2 线程池的分类
第十二章 Bitmap的加载和Cache
- Bitmap的高效加载
- Android中的缓存策略
2.1 LruCache
2.2 DisLruCache
2.3 ImageLoader - ImageLoader的使用
3.1 照片墙效果
3.2 优化列表的卡顿现象
第十三章 综合技术
- 使用CrashHandler来获取应用的crash信息
- 使用mutidex来解决方法数越界
- Android的动态加载技术
- 反编译初步
4.1 使用dex2jar 和jd-gui反编译apk
4.2 使用apktool对apk进行二次打包
第十四章 JNI 与NDK编程
- JNI的开发流程
- NDK的开发流程
- JNI的数据类型和类型签名
- 调用Java方法的流程
第十五章 Android性能优化
- Android 性能优化的方法
1.1 布局优化
1.2 绘制优化
1.3 内存泄漏优化
1.4 响应速度优化和ANR日志分析
1.5 ListView 和 Bitmap优化
1.6 线程优化
1.7 一些性能优化建议 - 内存泄漏分析指MAT工具
- 提高程序的可维护性
第一章 Activity的生命周期和启动模式
1. Activity的生命周期全面分析
1.1 activity 典型情况下的生命周期分析
有用户正常参与的情况下所发生的Activity生命周期的变化
- onCreate : 表示Activity正在被创建。
- onRestart : 当前Activity从不可见重新变为可见状态时。
- onStart : 边事Activity 正在被启动,此时已经可见,但是还没有出现在前台,无法与用户交互。
- onResume : 表示Acitivity可见并且出现在前台开始活动。
- onPause : onPause执行完,新Activity的onResume才会执行,由于这个原因,不能再onPause 方法中做耗时操作而使得新Activity尽快地显示出来并切换到前台;此时Activity仍然可见,但是无法交互。(拉起透明主题Activity,Dialog出现时就只会回到onPause ,不回调 onStop,此时activity 可见,但无法与用户进行交互)
- onStop :表示Activity即将停止,并且不可见,可以做一些稍微重量级的工作,同样不能太耗时。
- onDestroy : 表示Activity即将被销毁,可以做一些回收工作和最终的资源释放。
1.2 activity 异常情况下的生命周期分析
- 资源相关的系统配置发生改变导致的Activity被杀死并重新创建,例如手机发生屏幕旋转。
给Activity添加android:configchanges属性可以让Activity在屏幕旋转的时候不重新创建。 - 资源内存不足导致低优先级的Activity被杀死,Activity优先级从高到低:
(1)前台Activity------正在和用户交互的Activity,优先级最高。
(2)可见但非前台Activity------比如Activity中弹出一个对话框,导致Activity科技那但是位于后台无法和用户进行交互。
(3) 后台Activity------已经被暂停的Activity,比如执行了onStop,优先级最高。
如果一个进程中没有四大组件在执行,那么这个进程很快被系统杀死。最好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易被系统杀死。
2. Activity 启动模式
Activity默认启动模式,多次启动同一个Activity, 系统会重复创建多个实例。因此提供启动模式,让开发选择,来解决这个问题。
2.1 Activity 的 LauncherMode
(1)Standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
(2)singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数可以取出当前请求的信息。需要注意的是这个Activity的onCreate 、onStart 不会被系统调用,因为它没有发生改变。如果新Activity的实例已存在但不是位于栈顶,那么新Activity仍然会重新创建。
(3)singleTask:栈内复用模式。这是一种单实例模式,如果Activity在一个栈中已经存在,那么多次启动此Activity都不会创建实例,也会回调onNewIntent()方法。singleTask默认具有clearTop的效果,加入任务栈的情况是ADBC ,此时Activity D 以singleTask的方式请求启动,会把Activity BC先出栈,于是最终栈内的情况是AD。
(4)singleInstance:加强的singleTask模式,除了具备singleTask模式所有特性外,具有这种模式的Activity只能单独位于一个任务栈中。
taskAffinity 属性
taskAffinity,可以翻译为任务相关性。这个参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名,当 Activity 设置了 taskAffinity 属性,那么这个 Activity 在被创建时就会运行在和 taskAffinity 名字相同的任务栈中,如果没有,则新建 taskAffinity 指定的任务栈,并将 Activity 放入该栈中。另外,taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义。
如何给Activity指定启动模式?有两种方法,第一种是通过清单文件为Activity指定
<activity android:name=".SecondActivity"
android:launchMode="singleTask"/>
另一种启情况就是通过intent的标志位为Activity指定启动模式
Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
这两种方式都可以为Activity指定启动模式,但是二者还是有一些区别的,首先,优先级第二种比第一种高,,其次,上述两种方式在限定范围内有所不同,比如,第一种方式无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法指定singleInstance模式
2.2 Activity 的 Flags
Activity的Flags有很多,这里主要是分析一些常用的标记位,标记位的作用很多,有些标志位可以设置Activity的启动模式,比如FLAG_ ACTIVITY _ NEW _ TASK,还有一些直接影响Activity的运行状态,比如FLAG_ ACTIVITY_ CLEAR_ TOP,下面我们来说下一些常用的标记位,剩下的读者可以去看下官方文档,大部分的情况下,Activity不需要设置标记位,因此对于标记位理解即可,在使用标记位的时候,要注意有些标记位是系统内部使用的,应用不需要去设置这些以防出问题。
FLAG_ ACTIVITY_ NEW _ TASK
这个标志位的作用是为Activity指向‘singleTask’启动模式,其效果和XML中指定该模式相同
FLAG_ ACTIVITY_ SINGLE _ TOP
这个标志位的作用是为Activity指向‘singleTop’启动模式,其效果和XML中指定该模式相同
FLAG_ ACTIVITY_ CLEAR _ TOP
具有此标记位的Activity,当他启动时,在同一个任务栈中所有位于他上面的Activity都要出栈,这个模式一般需要和FLAG_ ACTIVITY_ NEW _ TASK配合使用,在这种情况下,被启动的Activity的实例如果已经存在,那么系统就会调用它的onNewIntent,如果被启动的Activity采用标准模式,那么他连同他之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶
FLAG_ ACTIVITY_ EXCLUDE_ FROM _ RECENTS
具有此标记位的Activity,不会出现在历史Activity的列表当中,当某种情况下我们不希望用户通过历史列表回到我们的Activity的时候就使用这个标记位了,他等同于在XML中指定Activity的属性:android:excludeFromRecents="true"
3. IntentFilter匹配规则
我们知道,启动Activity分为两种,显示调用和隐式调用,二者的区别这里就不多讲了,显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,而隐式意图则不需要明确指定调用信息,原则上一个intent不应该即是显式调用又是隐式调用,如果二者共存的话以显式调用为主,显式调用很简单,这里主要介绍隐式调用,隐式调用需要intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity,IntentFilter中的过滤信息有action,category,data,下面是一个过滤规则的实例:
<activity
android:name=".CodeActivity"
android:configChanges="screenLayout"
android:launchMode="singleTask"
android:taskAffinity="com.liuguilin.activitysample1">
<intent-filter>
<action android:name="com.liuguilin.activitysample.c" />
<action android:name="com.liuguilin.activitysample.d" />
<category android:name="com.liuguilin.category.c" />
<category android:name="com.liuguilin.category.d" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data信息,否则匹配失败,一个过滤列表中的action,category,data可以有多个,所有的action,category,data分别构成不同类别,同一类型的信息共同约束当前类别的匹配过程,只有一个intent同时匹配action类别,category类别,data类别才算是匹配完成,只有完全匹配才能成功启动目标Activity,另外一点,一个Activity钟可以有多个intent-filter,一个intent只要能匹配一组intent-filter即可成功启动Activity。
- 1.action的匹配规则
action是一个字符串,系统预定了一些action,同时我们也可以在应用中定义自己的action,action的匹配规则是intent中的action必须能够和过滤规则中的action匹配,这里说的匹配是指action的字符串值完全一样,一个过滤规则中的可以有多个action,那么只要intent中的action能够和过滤规则匹配成功,针对上面的过滤规则,需要注意的是,intent如果没有指定action,那么匹配失败,总结一下,action的匹配需求就是intent中的action存在且必和过滤规则一样的action,这里需要注意的是他和category匹配规则的不同,另外,action区分大小写,大小写不同的字符串匹配也会失败
- 2.category的匹配规则
category是一个字符串,系统预定义了一些category,同时我们也可以在应用中定义自己的category。category的匹配规则和action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。换句话说,Intent如果出现了category,不管有几个category,对于每个category来说,它必须是过滤规则中已经定义的category。当然,Intent中可以没有category,如果没有category的话,按照上面的描述,这个Intent仍然可以匹配成功。这里要注意下它和action匹配过程的不同,action
是要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,而category要求Intent可以没有category,但是如果你一旦有category,不管有几个,每个都要能和过滤规则中的任何一个category相同。为了匹配前面的过滤规则中的category,我们可出下面的Intent,intent.addcategory (“com.ryg.category.c”)或者Intent.addcategory (“com rcategory.d)亦或者不设category。为什么不设置category也可以匹配呢?原因是系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以这个category就可以匹配前面的过滤规则中的第三个category。同时,为了我们的activity能够接收隐式调用,就必须在intent-filter中指定“android intent categor.DEFAULT”这个category,原因刚才已经说明了。
- 3.data匹配规则
https://blog.csdn.net/lixpjita39/article/details/78201689
第二章 IPC机制
- Android IPC简介
- Android中的多进程模式
2.1 开启多进程模式
2.2 多进程模式的运行机制 - IPC基础概念介绍
2.1 Serializable 接口
2.2 Parcelable 接口
2.3 Binder - Android中的IPC方式
4.1 使用Bundle
4.2 使用文件共享
4.3 使用Messenger
4.5 使用AIDL
4.5 使用ContentProvider
4.6 使用Socket - Binder连接池
- 选择合适的IPC方式
第三章 View的事件体系
- View基础知识
1.1 什么是View
1.2 View的位置参数
1.3 MotionEvent和TouchSlop
1.4 VelocityTracker 、GestureDectector 和 Scroller - View的滑动
2.1 使用scrollTo / scrollBy
2.2 使用动画
2.3 改变布局参数
2.4 各种滑动方式的对比 - 弹性滑动
3.1 使用Scroller
3.2 通过动画
3.3 使用延时策略 - View的事件分发机制
4.1 点击事件的传递规则
4.2 事件分发的源码解析 - View的滑动冲突
5.1 常见的滑动冲突场景
5.2 滑动冲突的处理规则
5.3 滑动冲突的解决方式
第四章 View的工作原理
- 初识 ViewRoot 和 DecordView
- 理解MeasureSpec
2.1 MeasureSpec
2.2 MeasureSpec 和 LayoutParams的对应关系 - View的工作过程
3.1 measure过程
3.2 layout过程
3.3 draw过程 - 自定义View
4.1 自定义View的分类
4.2 自定义View须知
4.3 自定义View示例
4.4 自定义View的思想
第五章 理解RemoteViews
- RemoteViews的应用
1.1 RemoteViews在通知栏上的应用
1.2 在桌面小部件上的应用
1.3 PendingIntent概述 - RemoteViews的内部机制
- RemoteViews的意义
第六章 Android Drawable
- Drawable简介
- Drawable 的分类
2.1 BitmapDrawable
2.2 ShapeDrawable
2.3 LayerDrawable
2.4 StateListDrawable
2.5 LevelListDrawable
2.6 TransitionDrawable
2.7 InsertDrawable
2.8 ScaleDrawable
2.9 ClipDrawable - 自定义Drawable
第七章 Android 动画升入分析
- View动画
1.1 View动画的种类
1.2 自定义View动画
1.3 帧动画 - View动画的特殊使用场景
2.1 LayoutAnimation
2.2 Activity的切换效果 - 属性动画
3.1 使用属性动画
3.2 理解插值器和估值器
3.3 属性动画的监听器
3.4 对任意属性做动画
3.5 属性动画的工作原理 - 使用动画注意事项
第八章 理解Window 和 WindowManager
- Window和WindowManager
- Window的内部机制
2.1 Window 的添加过程
2.2 Window 的删除过程
2.3 Window 的更新过程 - Window的创建过程
3.1 Activity的Window创建过程
3.2 Dialog的Window创建过程
3.3 Toast的Window创建过程
第九章 四大组件的工作过程
- 四大组件的运行状态
- Activity的工作过程
- Service的工作过程
3.1 Service的启动过程
3.2 Service的绑定过程 - BroadcastReceiver的工作过程
4.1 广播的注册过程
4.2 广播的发送和接收过程 - ContentProvier的工作过程
第十章 Android 消息机制
- Android的消息机制概述
- Android的消息机制分析
2.1 ThreadLocal的工作原理
2.2 消息队列的工作原理
2.3 Lopper的工作原理
2.4 Handler的工作原理 - 主线程的消息循环
第十一章 Android 的线程和线程池
- 主线程和子线程
- Android中线程的形态
2.1 AsyncTask
2.2 AsyncTask的工作原理
2.3 HandlerThread
2.4 IntentService - Android中的线程池
3.1 ThreadPoolExecutor
3.2 线程池的分类
第十二章 Bitmap的加载和Cache
- Bitmap的高效加载
- Android中的缓存策略
2.1 LruCache
2.2 DisLruCache
2.3 ImageLoader - ImageLoader的使用
3.1 照片墙效果
3.2 优化列表的卡顿现象
第十三章 综合技术
- 使用CrashHandler来获取应用的crash信息
- 使用mutidex来解决方法数越界
- Android的动态加载技术
- 反编译初步
4.1 使用dex2jar 和jd-gui反编译apk
4.2 使用apktool对apk进行二次打包
第十四章 JNI 与NDK编程
- JNI的开发流程
- NDK的开发流程
- JNI的数据类型和类型签名
- 调用Java方法的流程
第十五章 Android性能优化
- Android 性能优化的方法
1.1 布局优化
1.2 绘制优化
1.3 内存泄漏优化
1.4 响应速度优化和ANR日志分析
1.5 ListView 和 Bitmap优化
1.6 线程优化
1.7 一些性能优化建议 - 内存泄漏分析指MAT工具
- 提高程序的可维护性