Starting an Activity
不像其他的编程模式中,应用程序是由main()方法发起的,Android系统启动代码在一个activity实例通过调用的回调方法,对应于特定阶段的生命周期。有一系列回调方法用于启动一个activity,和一系列回调方法用以拆毁一个activity。
这一课将提供一个生命周期方法的总览,并且告诉你如何处理第一个回调方法,在创建一个新的activity实例时。
了解生命周期回调(Understand the Lifecycle Callbacks)
在一个activity的生命周期中,系统调用的一组核心的生命周期方法序列类似的一个阶梯金字塔。就是说,activity生命周期的每一个阶段是一个单独的步骤的金字塔。为系统创建了一个新的activity实例,每个回调方法移动activity状态的一个步骤对顶部。顶部的塔是在该点的,activity在前台运行,用户可以与它交互。
当用户开始离开activity时,系统会调用其他的(函数)方法,把activity的状态从金字塔向下转移,以拆除这个activity。在某些情况下,活动将只有一部分的方式下锥体等(如当用户切换到另一个应用程序),这一点让activity可以回到顶部(如果用户返回到activity),并能恢复到用户离开时的样子。
下面是Activity生命周期的一个简单图示,就像一个金字塔一样。这个图示反映出了那些使得activity状态向上的回调方法,也反映了那些使得activity状态向下的回调方法。activity也可以从暂停状态(Paused)或停止状态(Stopped)返回到Resumed状态。
根据根据需要创建的activity的复杂程度,你可能不需要实现所有生命周期的方法。然而,重要的是你了解每一个执行,以确保您的应用程序的行为方式符合用户的期望。适当地实现你的activity生命周期中的方法,可以确保你的应用程序在以下几个方面表现的好一些:
- 当用户正在使用你的程序时,突然接听电话或者切换到其它的程序,它不至于会崩溃。
- 当用户不再使用你的程序时,它不会继续消耗宝贵的系统资源。
- 当用户暂时离开你的程序,再返回时不会丢失用户的进展。
- 当手机屏幕横向纵向切换时,它不会崩溃或者丢失用户的进度。
activity在不同的状态之间进行转变时,存在几状况。然而,这些状态中只有三种是静态的(activity可以持续的状态)。换句话说,activity可以在这三种状态之一,存在一段比较长的时间。这三种状态分别是:
重返状态(Resumed)
在这个状态,activity处于屏幕最前端,并且用户可以与之进行交互。(有时也被称为“运行”状态。)暂停状态(Paused)
在这个状态,activity被其它的activity部分地遮挡住了。这个其它的activity位于屏幕最前端,要么是半透明的,要么没有占据整个屏幕。被暂停的activity无法接受用户的输入,也不能执行任何代码。停止状态(Stopped)
在这种状态下,activity是完全隐藏着的,并且用户不可见;这被认为是在背景下。在停止状态中,该activity的实例和它的所有状态信息,例如成员变量,都是保留的,但它不能执行任何代码。Activity的其他状态(创建Created和开始Started)都是短暂的。系统会通过调用下一个生命周期的回调方法,来使得它们快速转换到下一个状态。换句话说,系统在调用onCreate()方法之后,立马就调用onStart()方法,紧接着就是调用onResume()方法。
这就是Activity最基本的生命周期。现在,你可以开始学习有关的一些具体生命周期行为了。
指定应用程序的启动Activity(Specify Your App's Launcher Activity)
当用户从手机主屏幕上选择你的应用程序图标时,Android系统就会调用一个Activity的onCreate()方法。这个Activity就是你为自己的应用程序指定的那个“launcher”(或“main”)activity。它是你的的应用程序对外用户界面的主要入口。
你可以在Android清单文件(AndroidManifest.xml)中指定哪个activity作为主要activity。这个文件在你项目的根目录下。
你必须在清单文件中使用<intent-filter>来声明应用程序的主要activity,同时指定MAIN动作和LAUNCHER类别。例如:
注意,当你使用Android SDK工具创建一个新的Android工程时,默认的工作文件中已经包含了一个Activity类,并且把它声明在清单文件里了。
如果你的activity中有一个没有声明MAIN行为或者LAUNCHER类别,那么你的应用程序图标将不会出现在主屏幕的应用程序列表中。
创建一个新的实例(Create a New Instance)
大多数应用程序包括几个不同的activity,允许用户执行不同的动作。是否有一个活动的主要活动的创造,当用户点击您的应用程序图标或不同的活动,您的应用程序启动响应用户操作,系统创建新的Activity实例通过调用onCreate()方法。
你必须实现oncreate()方法,它执行基本的应用程序启动逻辑,而这在activity的整个生命周期中应该只发生一次。例如,你的onCreate()方法实现应该定义用户界面,并可能实例化一些类范围的变量。
例如,下面例子中的onCreate()方法显示出一些执行activity基本安装的代码,如宣布用户界面(定义在一个布局文件中),定义成员变量,并配置一些用户界面。
TextView mTextView; // Member variable for text view in the layout@Overridepublic 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); }}
一旦onCreate()执行完成,系统会接二联三地调用onStart()和onResume()方法。你的activity不会驻留在创建(Created)或开始(Started)状态。技术上,当onStart()方法被调用后,activity就对用户可见了,但紧接着onResume()方法就被调用,activity会保持在恢复(Resumed)状态,直到某个事件发生才引起状态改变,例如当接收到一个电话,或用户导航到其他的activity,或设备的屏幕关闭。
在接下来的其他课程中,你将会看到其他的启动方法,onStart()和onResume()。它们在你的acvitity的生命周期中,被用来从暂停(Paused)或停止(Stopped)状态中恢复activity。
注意:onCreate()方法包括一个参数,名为savedInstanceState。它将在后面有关重建Activity(Recreating an Activity)的课程中讨论。
图2是另一个示例,它强调了activity生命周期结构中的三个主要的回调。在创建一个activity的新实例时,系统会依次调用这三个回调函数:onCreate(),onStart(),和onResume()。一旦这一系列回调完成,activity就达到了恢复(Resumed)状态,用户可以与它交互,直到他们切换到一个不同的activity。
Activity的销毁(Destroy the Activity)------------------------------------------------------------------------------------------------------------------------------------------
正如activity生命周期第一个回调是onCreate(),其最后一个回调是onDestroy()。系统调用这个方法作为最后的信号,你的activity实例将被从系统内存中完成删除。
大多数应用程序不需要实现这个方法,因为本地类引用已经随activity一起被销毁了,你的activity应该在onPause()和onStop()执行期间做一些清理活动。然而,如果你的activity在执行onCreate()方法时创建了后台运行的线程,或者是其他长期运行的资源(如果没有正确关闭则可能引发内存泄漏),那么你就应该在onDestroy()方法中杀了他们。
@Overridepublic void onDestroy() { super.onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate() android.os.Debug.stopMethodTracing();}注意:系统调用ondestroy()后它已经称为onpause()和onstop()在所有情况下只有一个:你打电话时finish()在oncreate()方法。在某些情况下,例如当你的活动可作为临时决定推出另一个活动,你可以称finish()内oncreate()破坏活动。在这种情况下,系统会立即要求ondestroy()没有要求任何其他生命周期的方法。