Android开发艺术探索——读书笔记

1.1

1. onStart和onResume,onPause和onStop之间的关系和实质不同?P4

onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显区别。

2. 假设Activity A打开了Activity B ,那么A的onPause一定是在B的onResume之前先执行的。P4

Activity A onPause

Activity B onCreate

Activity B onStart

Activity B onResume

Activity A onStop

因此,为了不影响Activity的切换,我们不能在onPause和onStop中进行耗时操作。

3. Activity的异常生命周期问题。P8

Activity异常终止,会执行完整的onPause、onStop、onDestory过程,同时也会执行onSaveInstanceState来保存当前Activity的状态。onSaveInstanceState调用时机在onStop之前,和onPause没有既定的时序关系。Activity的重建也会执行其完整的生命周期方法,我们可以在onRestoreInstanceState和onCreate中拿到onSaveInstanceState传递过来的Bundle对象,onRestoreInstanceState在onStart之后被调用。此外,如果onRestoreInstanceState被调用,其参数Bundle对象一定是非空的,onCreate如果是正常调用Bundle为null。官方文档建议在onRestoreInstanceState中恢复数据。

4.屏幕方向改变不重建activity的方法。P15

1.2

1. Activity的四种启动模式:standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)。singleTop和singleTask的区别需要清楚。P25

2. Activity常用的几种Flags需要了解。P27

3. Activity的启动方式分为两种,显式调用和隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,IntentFilter中的过滤信息有action、category、data。如果不匹配将无法启动目标Activity。

4. action的匹配规则?

action在Intent中必须给出,并且要存在于过滤列表中。

5. category的匹配规则?

category在Intent中可以不给出,但是一旦给出了就必须要存在于过滤列表中。startActivity或startActivityForResult方法会给Intent默认带上“android.intent.category.DEFAULT”这个category,因此,一个Activity想要被隐式调用,就必须在过滤列表中添加“android.intent.category.DEFAULT”这个category。

6. data的匹配规则?

data如果在过滤列表中有定义,那么Intent中也必须要定义可匹配的data。过滤列表中申明的data可以不指定URI,会有默认值为content和file。intent指定完整的data必须要调用setDataAndType方法,不能先使用setData再调用setType,因为这两个方法会彼此清除对方的值。

7. 在隐式调用一个Activity的时候,可以通过PackageManager的resolveActivity方法或者Intent的resolveActivity方法进行判断是否能够成功执行隐式调用。resolveActivity的第二个参数要使用MATCH_DEFAULT_ONLY这个标记位,表示仅匹配在intent-filter中声明了“android.intent.category.DEFAULT”这个category的Activity。用了这个标记位,只要resolveActivity不返回null,隐式调用就一定可以成功。P34

2

1.进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

2.一般来说,使用多进程会造成如下几个方面的问题:

(1)静态成员和单例模式完全失效。

(2)线程同步机制完全失效。

(3)SharedPreference的可靠性下降。

(4)Application会多次创建。

3.当客户端发起远程请求时,由于当前线程会被挂起直至服务端进程返回数据,所以如果一个远程方法是耗时的,那么不能在UI线程中发起远程请求;其次,由于服务端的Binder方法运行在Binder的线程池中,所以Binder方法不管是否耗时都应该采用同步的方式去实现,因为它已经运行在一个线程中了。

4.Binder又两个重要的方法linkToDeath和unlinkToDeath作为Binder死亡代理,使用方法P60。

5.Android中的IPC方式

    Bundle、使用文件共享(存在并发读/写问题,包括SharedPreferences不被建议在进程间通信使用。)、Messenger(底层为AIDL)P65、使用AIDL P71。

6.AIDL文件中,并不是所有的数据类型都是可以使用的,支持以下类型:

    基本数据类型(int 、long、char、boolean、double等);

    String和CharSequence;

    List,只支持ArrayList,里面每个元素都必须能够被AIDL支持;

    Map,只支持HashMap,里面的每个元素都必须被AIDL支持,包括key和value;

    AIDL,所有的AIDL接口本身也可以在AIDL文件中使用。

其中自定义的Parcelable对象和AIDL对象必须要显示import进来,不管它们是否和当前的AIDL文件位于同一个包内。

7.如果AIDL文件中用到了自定义的Parcelable对象,那么必须新建一个和它同名的AIDL文件,并在其中声明它为Parcelable类型:

Book.java

```

public class Book{

}

```

Book.aidl

```

package com.xxx.xxx;

parcelable Book

```

3

1.事件分发流程

点击事件到达顶级View(一般是一个ViewGroup)以后,会调用ViewGroup的dispatchTouchEvent方法,然后的逻辑是这样的:如果顶级ViewGroup拦截事件即onInterceptTouchEvent返回true,则事件由ViewGroup处理,这时如果ViewGroup的mOnTouchListener被设置,则onTouch会被调用,否则onTouchEvent会被调用。也就是说,如果都提供的话,onTouch会屏蔽掉onTouchEvent。在onTouchEvent中,如果设置了mOnClickListener,则onClick会被调用。如果顶级ViewGroup不拦截事件,则事件会传递给它所在的点击事件链上的子View,这时子View的dispatchTouchEvent会被调用。到此为止,事件已经从顶级View传递给了下一层View,接下来的传递过程和顶级View是一致的,如此循环,完成整个事件的分发。

你可能感兴趣的:(Android开发艺术探索——读书笔记)