《Android开发艺术探索》读后笔记1

来源:互联网 发布:2017年10月份宏观数据 编辑:程序博客网 时间:2024/05/22 07:50

第一章: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

1 0