Starting an Activity 前端
不像其余的编程模式中,应用程序是由main()方法发起的,Android系统启动代码在一个activity实例经过调用的回调方法,对应于特定阶段的生命周期。有一系列回调方法用于启动一个activity,和一系列回调方法用以拆毁一个activity。 java
这一课将提供一个生命周期方法的总览,而且告诉你如何处理第一个回调方法,在建立一个新的activity实例时。 android
了解生命周期回调(Understand the Lifecycle Callbacks) 编程
在一个activity的生命周期中,系统调用的一组核心的生命周期方法序列相似的一个阶梯金字塔。就是说,activity生命周期的每个阶段是一个单独的步骤的金字塔。为系统建立了一个新的activity实例,每一个回调方法移动activity状态的一个步骤对顶部。顶部的塔是在该点的,activity在前台运行,用户能够与它交互。 app
当用户开始离开activity时,系统会调用其余的(函数)方法,把activity的状态从金字塔向下转移,以拆除这个activity。在某些状况下,活动将只有一部分的方式下锥体等(如当用户切换到另外一个应用程序),这一点让activity能够回到顶部(若是用户返回到activity),并能恢复到用户离开时的样子。 ide
下面是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类别。例如:
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
注意,当你使用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 @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); } }
一旦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()方法中杀了他们。
@Override public 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()没有要求任何其余生命周期的方法。