Activity相关
Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,Broadcast Receiver广播接收器)之一。它提供了一个界面用于和用户交互,使用户可以在界面上进行点击、滑动等操作。
在android 中,Activity 拥有四种基本状态:
1.Active/Running
一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。
2. Paused
当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
3. Stopped
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
4. Killed
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
Activity是Android中的一个组件,提供了一个界面用于和用户交互,使用户可以在界面上进行点击、滑动等操作。
在上图中,Activity有三个关键的循环:
1. 整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
2. 可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
3. 前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
以下框架 Activity 包括每一个基本生命周期方法:
方法 | 说明 | 是否能事后终止? | 后接 | ||
---|---|---|---|---|---|
| 首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态(请参阅后文的保存 Activity 状态)。 始终后接 | 否 | onStart() | ||
| 在 Activity 已停止并即将再次启动前调用。 始终后接 | 否 | onStart() | ||
| 在 Activity 即将对用户可见之前调用。 如果 Activity 转入前台,则后接 | 否 | onResume() 或 onStop() | ||
| 在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。 始终后接 | 否 | onPause() | ||
| 当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。 如果 Activity 返回前台,则后接 | 是 | onResume() 或 onStop() | ||
| 在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。 如果 Activity 恢复与用户的交互,则后接 | 是 | onRestart() 或 onDestroy() | ||
| 在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人对 Activity 调用了 ),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过 方法区分这两种情形。 | 是 | 无 |
Adapter
adapter是AdapterView和data之间的桥梁,也就是数据和UI(View)之间一个重要的纽带。我们常用的Adapter有四种,分别是BaseAdapter、SimpleAdapter、ArrayAdapter、SimpleCursorAdapter四种。 BaseAdapter:基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承自接口类Adapter,由于是基础类型,所以自由度高,可以修改的地方多。
SimpleAdapter:简单适配器,系统自定义了一些方法,可以重写这些方法。ArrayAdapter:数据和UI一对一,传入数据源和布局文件,完成显示。SimpleCursorAdapter:指向性适配器,指向数据库,可以方便地把数据库的内容以列表的形式展示出来。
List
List:一个元素有序、可重复的集合。集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
我们可以直接通过 add 方法添加元素,使用 add 方法的时候也可以根据索引值将数据插入特定位置;可以通过 set 方法修改指定索引值位置的元素;可以获取指定元素的索引值。
ArrayList
1.ArrayList 是 List 的一个实现类,完全支持我们上面所说的 List 的用法。ArrayList 类是基于数组实现的,所以 ArrayList 封装了一个动态的、允许再分配的 Object[] 数组。ArrayList 对象使用 initialCapacity 参数来设置该数组的长度。当添加元素的数量超出了该数组的长度时,它们的 initialCapacity 会自动增加。
2.
正常使用时,我们无需关系 ArrayList 的 initialCapacity。但是,如果我们需要向集合中添加大量元素的时候,我们可以使用ensureCapacity(int minCapacity)一次添加 initialCapacity,这样做可以减少重分配次数,提高性能。
3.
当我们集合的元素数量确定不再改变时,我们还可以使用 trimToSize()方法调整集合长度为当前元素个数,这样我们可以减少集合对象占用的存储空间。
4.
ArrayList集合同样是线程不安全的,多个线程同时操作一个集合时,我们需要手动保证线程安全。可以使用 Collections 工具类。
LinkedList
LinkedList 类是 List 的一个实现类,所以它是一个 List 集合,可以通过索引来随机访问集合中的元素;同时,它也实现了Deque 接口,可以当成双端队列使用。(Deque代表一个“双端队列",双端队列可以从两端来添加删除数据,因此 Deque 的实现类既可以当成队列使用,也可以当成栈使用)。
List 总结
1
、List 是一个线性表接口,ArrayList 和 LinkedList 是线性表的两种典型实现:基于数组的线性表和基于链的线性表。一般来说,数组以一块连续内存区来保存所有的数组元素,所以,数组在随机访问时性能最好,所有内部以数组作为底层实现的集合在随机访问的时候性能都比较好;而内部以链表作为底层实现的集合在执行插入、删除操作时性能比较好;但总体来说,ArrayList 的性能要比 LinkedList 的性能要好,因此我们优先考虑使用 ArrayList。
2
、如果遍历List集合,对于 ArrayList,我们考虑使用随机访问(get 方法)遍历,对于 LinkedList 考虑采用迭代器(Iterator)遍历。
3、
多个线程同时操作 List 集合的时候,我们需要手动保证线程安全,可以使用工具类 Collections 将集合包装成线程安全的集合。