android分为四层:应用程序层(Applications)、应用程序框架层(Application Framework)、系统运行库层(Libraries和Android Runtime)和Linux内核层(Linux Kernel)。
Framework框架包含三个主要部分:客户端,服务端,Linux驱动。服务端主要包含两个重要类:WindowManagerService(WmS)和ActivityManagerService;还包含两个重要的消息处理类(KeyQ类,读取用户UI操作消息,比如按键/触摸屏/trackball/鼠标等;InputDispatcher类,从QueueEvent中读取用户消息,并进行过滤,过滤后将消息发送给当前活动的客户端)。
APK程序中有至少含有三个线程:两个binder对象对应两个线程(ViewRoot.W对象和Application对象,都继承与binder,用于接收linux Binder驱动发送的IPC调用),主线程。
UI线程是从ActivityThread运行的,在该类的main方法中。
传递消息一般指多个线程之间,而Activity本身不是线程。ActivityThread才是线程。
普通类的实例化都是程序员显示完成的,而Activity的实例化却是由framework完成的,程序员只能使用startActivity方法告诉framework去运行哪个Activity,程序员得不到Activity对象的引用。可借助Activity.getApplication函数,获取Application对象,程序中唯一,该对象的名称可以在AndroidMenifest中指定。还可以通过Intent,SharePreference/文件/数据库。
窗口:程序员所看到的屏幕上的某个独立的界面,比如Activity界面,一个对话框,一个Menu菜单。从WmS角度讲,窗口是接收用户消息的最小单元;给WmS添加一个窗口调用WindowManager类的addView方法,即添加一个View对象。
ViewRoot类:客户端申请创建窗口时需要一个客户端代理,用以和WmS进行交互。WmS所管理的每一个窗口都会对应一个ViewRoot类。
W类:ViewRoot的内部类,继承于Binder,用于向WmS提供一个IPC接口,从而让WmS控制窗口客户端的行为。
一个Activity就是一个场景(Context),一个Service也对应一个场景。Context.getResources方法回去的是同一个全局对象。
Context个数=Service个数+Activity个数+1;
Context类本身是一个纯abstract类;ContextWrapper一个包装而已,构造函数中必须包含一个真正的Context引用。ContextThemeWrapper包含了与主题Theme相关的接口,主题指的是AndroidManifest中通过android:theme为Applicaiton的元素或者Activity的元素指定的主题。