copy from :
不像其他编程范式一样: 程序从 main()方法开始启动. Android 系统根据生命周期的不同阶段唤起对应的回调函数来执行代码. 系统存在启动与销毁一个 activity 的一套有序的回调函数.
这一个课会介绍那些生命周期中最重要的回调函数, 并演示如何处理启动一个 activity 所涉及到的回调函数.
理解生命周期的回调
在一个 activity 的生命周期中, 系统会像金字塔模型一样去调用一系列的生命周期回调方法. Activity 生命周期的每一个阶段就像金字塔中的台阶. 当系统创建了一个新的 activity 实例, 每一个回调函数会向上一阶的移动 activity 状态. 金字塔顶端意味着 activity 是跑在最前端的并且用户可以与它进行交互.
当用户开始离开这个 activity, 为了卸载这个 activity, 系统会调用其它方法来向下一阶移动 activity 状态. 在某些情况下, activity 会隐藏在金字塔下等待 (例如当用户切换到其他 App), 这个时候 activity 可以重新回到顶端(如果用户回到这个 activity) 并且恢复用户离开时的状态.
Figure 1. 下面这张图讲解了 activity 的生命周期:(这个金字塔模型要比之前 Dev Guide 里面的生命周期图更加容易理解, 更加形象)
根据你的 activity 的复杂度, 你也许不需要实现所有的生命周期方法. 然而, 你需要知道每一个方法的功能并确保你的 App 能够像用户期望的那样执行. 如何实现一个符合用户期待的 App, 你需要注意下面几点:
当使用你的 App 的时候, 不会因为有来电通话或者切换到其他 App 而导致程序 crash.
当用户没有激活某个组件的时候不要消耗宝贵的系统资源.
当离开你的 App 并且一段时间后返回, 不要丢失用户的使用进度.
当设备发送屏幕旋转的时候, 不会 crash 或者丢失用户的使用进度.
在下面的课程中会介绍上图所示的几个生命状态. 然而, 其中只有三个状态是静态的, 这三个状态下 activity 可以存在一段比较长的时间.(其它几个状态会很快就切换掉, 停留的时间比较短暂)
Resumed: 在这个状态, activity 是在最前端的, 用户可以与它进行交互.(通常也被理解为 "running" 状态)
Paused: 在这个状态, activity 被另外一个 activity 所遮盖: 另外的 activity 来到最前面, 但是半透明的, 不会覆盖整个屏幕. 被暂停的 activity 不会再接受用户的输入且不会执行任何代码.(这里的不会执行任何代码并不代表了任何后台线程都不会工作)
Stopped: 在这个状态, activity 完全被隐藏, 不被用户可见. 可以认为是在后台. 当 stopped, activity 实例与它的所有状态信息都会被保留, 但是 activity 不能执行任何代码.
其它状态 (Created 与 Started)都是短暂的, 系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态. 也就是说, 在系统调用 onCreate(), 之后会迅速调用, 之后再迅速执行. 上面就是基本的 activity 生命周期.
指定你的程序首次启动的 Activity
当用户从主界面点击你的程序图标时, 系统会调用你的 App 里面的被声明为 "launcher" (or "main") activity 中的 onCreate()方法. 这个 Activity 被用来当作你的程序的主要进入点.
你可以在 AndroidManifest.xml 中定义哪个 activity 作为你的主 activity.
这个 main activity 必须在 manifest 使用包括 MAIN action 与 LAUNCHER category 的 < intent-filter > 标签来声明. 例如:
Note: 当你使用 Android SDK 工具来创建 Android 工程时, 工程中就包含了一个默认的声明有这个 filter 的 activity 类.
如果你的程序中没有一个 activity 声明了 action 或者 category, 那么在设备的主界面列表里面不会呈现你的 App 图标.
创建一个新的实例
大多数 App 都包括许多不同的 activities, 这样使得用户可以执行不同的动作. 不论这个 activity 是创建的主 activtiy 还是为了响应用户行为而新创建的, 系统都会调用新的 activity 实例中的 onCreate()方法.
你必须实现 onCreate()方法来执行程序启动所需要的基本逻辑.
例如: 下面的 onCreate()方法演示了为了建立一个 activity 所需要的一些基础操作. 如, 声明 UI 元素 , 定义成员变量, 配置 UI 等.(onCreate 里面尽量少做事情, 避免程序启动太久都看不到界面)
- TextView mTextView; // Member variable for text view in the layout
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Set the user interface layout for this Activity
- // The layout file is defined in the project res/layout/main_activity.xml
- file
- setContentView(R.layout.main_activity);
- // Initialize member TextView so we can manipulate it later
- mTextView = (TextView) findViewById(R.id.text_message);
- // Make sure we're running on Honeycomb or higher to use ActionBar APIs
- if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.HONEYCOMB) {
- // For the main activity, make sure the App icon in the action bar
- // does not behave as a button
- ActionBar actionBar = getActionBar();
- actionBar.setHomeButtonEnabled(false);
- }
- }
- Caution: Using the to prevent older systems from executing new APIs works in this way on Android 2.0 (API level 5) and higher only. Older versions will encounter a runtime exception.
一旦结束 onCreate 操作, 系统会迅速调用 onStart() 与 onResume()方法. 你的 activity 不会在 Created 或者 Started 状态停留. 技术上来说, activity 在 onStart()被调用后会开始被用户可见, 但是 onResume()会迅速被执行使得 activity 停留在 Resumed 状态, 直到一些因素发生变化才会改变这个状态. 例如接受到一个来电, 用户切换到另外一个 activity, 或者是设备屏幕关闭.
在后面的课程中, 你将看到其他方法是如何使用的, onStart() 与 onResume()在用户从 Paused or Stopped 状态中恢复的时候非常有用.
Note: onCreate() 方法包含了一个参数叫做 savedInstanceState, 这将会在后面的课程 - 重新创建 activity 的时候涉及到.
Figure 2. 上图显示了 onCreate(), onStart(), and onResume()是如何执行的. 当这三个顺序执行的回调函数完成后, activity 会到达 Resumed 状态.
销毁 Activity
activity 的第一个生命周期回调函数是 onCreate(), 它最后一个回调是. 系统会执行这个方法作为你 的 activity 要从系统中完全移除的信号.
大多数 apps 并不需要实现这个方法, 因为局部类的 references 会随着 activity 的销毁而销毁, 并且你的 activity 应该在 onPause()与 onStop()中执行清除 activity 资源的操作. 然而, 如果你的 activity 包含了你在 onCreate 时创建的后台线程, 或者是其他有可能导致内存泄漏的资源, 你应该在 OnDestroy()时杀死他们.
- @Override
- public void onDestroy() {
- super.onDestroy(); // Always call the superclass
- // Stop method tracing that the activity started during onCreate()
- Android.os.Debug.stopMethodTracing();
- }
Note: 系统通常是在执行了 onPause()与 onStop() 之后再调用 onDestroy() , 除非你的程序在 onCreate()方法里面就调用了 finish()方法,. 在某些情况下, 例如你的 activity 只是做了一个临时的逻辑跳转的功能, 它只是用来决定跳转到哪一个 activity, 这样的话, 你需要在 onCreate 里面去调用 finish 方法, 这样系统会直接就调用 onDestory 方法, 其它生命周期的方法则不会被执行.
Android Training - 详解 Activity 生命周期(Lesson 1 - 启动与销毁 Activity)
来源: http://www.bubuko.com/infodetail-3445509.html