第一章:Acitivity的生命周期
1. Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。
2. 当用户打开新的Activity或切换到桌面的时候,回调如下:onPause-》onStop。这里有一种特殊情况,如果新的Activity采用了透明主题,那么当前的Activity不会回调onStop。
3. onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是否位于前台这个角度来回调的,除了这种区别,实际使用中没有其它区别。
4. 当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率
5. onSavedInstanceState和onRestoreInstanceState只会在Activity被异常终止的情况下被调用,正常情况下系统不会回调这两个方法,并且onRestoreInstanceState一旦被调用,其参数bundle必定为非空,不需要在方法内做空值判断
6. View和Activity一样,每个View都有onSavedInstanceState和onRestoreInstanceState这两个方法,用于保存和恢复view的状态
7. 如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样进程就很容易被系统杀死,比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死
8. 避免屏幕旋转时Activity重启,可以在AndroidManifest.xml中对应Activity标签声明时加上“android:configChanges="orientation|screenSize"”即可;
9. Android有四种启动模式:standard、singleTop、singleTask和singleInstance。
standard:标准模式,这也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在;
singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前的请求信息。需要注意的是,这个Activity的onCreate、onStart不会被系统调用,因为它并没有发生改变。如果新的Activity的实例已经存在但不是位于栈顶,那么新的Activity仍然会重新创建;
singleTask:栈内复用模式。这是一种单实例模式,在这种情况下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent;
singleInstance:单实例模式,这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强一点,那就是具有此种模式的Activity只能单独地位于一个任务栈中。
10. Activity的Flags:
FLAG_ACTIVITY_NEW_TASK:这个标记位的作用是为Activity指定"singleTask"启动模式,其效果和在XML中指定该启动模式相同;
FLAG_ACTIVITY_SINGLE_TOP:这个标记位的作用是为Activity指定"singleTop"启动模式,其效果和在XML中指定该启动模式相同;
FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈;
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性"android:excludeFromRecents="true""。
11. IntentFilter的匹配规则
action:intent存在且必须和过滤规则中的其中一个action相同匹配,区分大小写。
category:intent可以没有category,如果有则每一个都要和过滤规则中的任何一个category相同。
data:匹配规则和action一样。
第二章:IPC机制(inter-ProcessCommunication,进程间通信)
1. 一般一个应用对应一个进程,多进程是指一个应用中存在多个进程。在一个应用中使用多进程只有一个方法,那就是给四大组件在AndroidMenifest中指定android:process属性。
方式1:android:process=”:romeote”
方式2:android:process=”com.android.test.remote”
以下两种方式的区别:
(1)方式1以“:”开头是一种简写方法,是指在当前进程名前面附加上当前的包名。
方式2是一种完整的命名方式,不会附加包名信息。
(2)以“:”开头的进程属于当前的私有进程,其它应用组件不可以和它跑在同一进程中,而不以“:”开头的进程属于全局进程,其它应用通过ShareUID方式可以和它跑在同一进程中。
2. 多进程带来的问题,Android会为每一个进程分配独立的虚拟机,不同的虚拟机在内存分配上有不同事的地址空间,这导致不同的虚拟机访问同一个对象会产生多份副本,主要有以下几个问题:
(1) 静态成员和单例模式完全失效。
(2) 线程同步机制完全失效。
(3) SharedPreferences的可靠性下降。
(4) Application会多次创建。
3. 系列化有两种:Serializable和Parcelable:
Serializable是Java中的序列化的接口,实现简单但是开销很大,序列化和反序列化过程需要大量I/O操作。
Parcelable是Android的序列化方式,实现麻烦点但是效率很高,是Android平台推荐使用的。
4.Android中有Intent、文件共享、AIDL、ContentProvider、网络通信等多种IPC通信机制,各种通信机制的特点如下:
(1)Intent:Activity、Receiver、Service这三个组件都支持Intent通信,Intent适合于传递可序列化的数据。
(2)文件共享:文件共享方式适合在对数据同步要求不高的进程之间进行通信,并且要妥善处理并发读/写的问题。
(3)AIDL: 功能强大,支持一对多并发通信,支持实时通信。使用复杂。
(4)ContentProvider:使用于应用间共享数据,ContentProvider主要以表格的形式来组织数据,并且可以包含多个表,对于每个表格来说,它们都具有行和列的层次性,这点和数据库很类似;虽然ContentProvider的底层数据看起来很像一个SQLite数据库,但是ContentProvider对底层的数据存储方式没有任何要求,我们既可以使用SQLite数据库,也可以使用普通的文件,甚至可以采用内存中的一个对象来进行数据的存储。
(5)网络通信:网络数据交换。
第三章 View的事件体系
1. View的坐标都是相对于View的父容器来说的,因此它是一种相对坐标
2. MotionEvent提供了两组方法:getX/getY和getRawX/getRawY,getX/getY返回的是相对于当前View左上角的x和y坐标,而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y坐标
3. TouchSlop是系统所能识别出的被认为是滑动的最小距离,如果两次滑动之间的距离小于这个常量,那么系统就不认为你是在进行滑动操作。这是一个常量,和设备有关,在不同设备上这个值有可能是不同的,可以通过如下方式获取这个常量:ViewConfiguration.get(getContext()).getScaledTouchSlop()。但我们在处理滑动时,尅利用这个常量来对触摸操作做去抖处理
4. VelocityTracker用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度
5. GesturceDetector用于辅助检测用户的单击、滑动、长按、双击等行为
6. Scroller用于实现View的弹性滑动,Scroller本身无法让View弹性滑动,它需要和View的computeScroll方法配合使用才能共同完成这个功能
7.可以通过如下三种方式来实现View的滑动:
(1通过View本身提供的scrollTo/scrollBy方法来实现滑动;特点是操作简单,适合对View内容的滑动
(2通过动画给View施加平移效果来实现滑动;特点是操作简单,适用于没有交互的View和实现复杂的动画效果
(3通过改变View的LayoutParams使得View重新布局从而实现滑动;操作稍微复杂,适用于有交互的View