Application、Activity、Service均继承自Context。Android会在下面几个时间点创建应用上下文Context:
- 创建Application
- 创建Activity
- 创建Service
当应用程序第一次启动时,Android系统都会创建一个Application对象,同时创建Application Context,所有组件都共同拥有这一Context对象,它贯穿整个应用程序的生命周期,为应用全局提供了功能和环境的支持。
创建Activity和Service组件时,系统也会创建Activity实例、Service实例的Context对象,故在内部类中须指定XXXActivity.this才可获得该Activity的Context对象。注意:仍能通过getApplicationContext()方法来获得APP的Context,但与组件的上下文引用在某些时候存在区别。
AOSP的Android项目源码目录结构
- development 应用程序开发相关
- framework Framework框架核心
- hardware 厂商硬件抽象层HAL代码
- out 编译后的代码输出目录
- packages 应用程序包
Android系统目录
- /system/app/ 存放系统APP
- /system/bin/ 存放Linux自带组件
- /system/build.prop 系统属性信息
- /system/fonts/ 系统字体,root后可下载TTF格式字体替换
- /system/framework/ 系统的核心文件、框架层
- /system/lib/ 所有共享库(.so)文件
- /system/sur/ 用户配置文件,如键盘布局、共享、时区文件等
/system/media/ 系统默认铃声、提示音等
/data/app/ 用户安装APP
- /data/data/ 包含APP的数据信息、文件信息、数据库信息等,以包名区分应用
- /data/system/ 手机各项系统信息
- /data/misc/ 保存大部分的Wi-Fi、VPN信息
第三章
Android控件架构
Android每个控件在界面中占得一块矩形区域。
控件大致被分为ViewGroup和View两类,ViewGroup作为父控件可包含并管理其子控件。
在控件所形成的树形结构中,上层控件(父)负责下层控件(子)的测量与绘制,并传递交互信息。
findViewById()方法在控件树中以深度优先遍历查找对应控件。
Activity界面架构

Activity界面架构图
Android中的Window对象通常由PhoneWindow实现,PhoneWindow将DecorView设置为整个应用窗口的根View。
DecorView将所要显示的内容呈现在PhoneWindow上,这里面的所有View的监听事件,都通过WindowsManagerService来进行接收,并通过Activity对象来回调相应的onClickListener。
当程序在onCreate()方法中调用setContentView()方法后,ActivityManagerService会回调onResume()方法,此时系统才会将整个DecorView添加到PhoneWindow中,并让其显示出来,从而最终完成界面的绘制。
View的测量
View的onMeasure()方法默认只支持EXACTLY模式,即只能响应指定的具体宽高值或是match_parent属性,因而如果要让自定义View支持wrap_content属性,就必须重写onMeasure()方法。
第四章
ListView使用技巧
使用ViewHolder
设置分割线
android:divider=”@android:color/darker_gray”
android:dividerHeight=”10dp”
or
android:divider=”@null”隐藏滚动条
android:scrollbars=”none”
隐藏点击效果
android:listSelector=”#00000000”
or
android:listSelector=”@android:color/transparent”动态更新ListView
mAdapter.notifyDataSetChanged()
处理空ListView
ListView listView = (ListView)findViewById(R.id.listview);
listView.setEmptyView(findViewById(R.id.empty_view));
在空数据时显示一张默认图片,在有数据的时候不会显示。
第八章
Activity
系统采用Activity栈的方式来管理Activity。
Activity形态
Active/Running:此时Activity处于栈的最顶层,可见、可与用户进行交互
Paused:被其它非全屏或半透明的Activity打断,如打开dialog风格的Activity,此时Activity依然可见,所有状态信息、成员变量依然保持,但失去焦点,无法与用户进行交互,在内存极低下会被系统回收。
Stopped:被另一Activity完全覆盖,此时,Activity不可见,但保持所有状态信息与成员变量。
Killed:被系统回收或者从未创建过。
Activity生命周期状态
Resumed:即Active/Running形态,稳定状态
Paused:即Paused形态,稳定状态
Stopped:即Stopped形态,稳定状态
Created、Started、Destroyed:过渡状态,很快结束
Activity启动与销毁过程
在系统调用onCreate()之后,就会马上调用onStarted(),然后继续调用onResume()进入Resumed状态,最后会停在Resumed状态,完成启动。系统会调用onDestroy()来结束Activity的生命周期使他回到Killed状态。
onCreate():创建基本的UI元素
onPause()和onStop():清除Activity的资源
onDestroy():因为引用会在Activity销毁的时候清除,而线程不会,所以此时清除开启的线程
Activity暂停与恢复过程
当处于栈顶的Activity部分不可见时,就会通过onPause()进入Paused状态。当结束阻塞后,会调用onResume()恢复到Resume状态。
onPause();释放系统资源,如Camera、Sensor、receivers
onResume():重新初始化在onPause()中释放的资源
Activity停止过程:每当变为不可见,总会调用onPause();每当变为可见,总会调用onStart()
Activity重新创建过程:如果长期处于Stopped状态且此时系统内存极为紧张时,就会回收Activity,并将其状态通过onSaveInstanceState()保存到Bundle对象中(若使用finish()结束Activity,则不会调用);在创新创建这些Activity时,保存的Bundle对象就会传递到Activity的onRestoreInstanceState()与onCreate()中。
Resumed -> onSaveInstanceState() -> Destroyed
onCraete() -> Created -> onRestoreInstanceState() -> Resumed