[安卓教程翻译]4.1 Starting an Activity
启动Activity
与其他以main()函数为入口的编程范例不同,Android系统在一个Activity对象中通过调用与其生命周期各个阶段对应的回调函数来初始化代码。有一系列的回调函数用以启动一个Activity,也有一系列的回调函数用以销毁Activity。
本节课程将为最重要的几个生命周期函数做一个概述,并向你展示如何控制第一个生命周期回调来创建你的Activity对象。
理解生命周期回调函数
Activity的整个生命周期中,系统连续调用一系列的生命周期函数,这看起来很像阶梯金字塔,也就是说,Activity的生命周期的每个阶段都是金字塔独立的一阶。当系统创建一个新的Activity对象,每个回调函数都使activity的状态向塔顶迈进一步。金字塔顶端的状态是——activity处于前台并可以与用户交互。
当用户要离开activity,系统条用其他函数使activity的状态向塔底下滑,逐步销毁activity。某些情况下,activity并不直接到塔底,而是仅仅向下一部分然后等待(比如,用户打开其他的app),在这种状态下,activity可能回到顶端(如果用户回到activity)并且从他离开的地方继续工作。

根据你activity的复杂程度,你可能不需要实现所有的生命周期函数。然而,理解每个生命周期函数并实现它们,确保你的app按照用户的期望运行十分重要,所以需要注意以下几点:
用户正在使用你的app,如果他突然接到电话或是打开其他app,确保你的app不会崩溃。
当用户没有频繁使用你的app,不要占用太多系统资源。
用户暂离你的app,过一会又切换回来,确保他之前操作的状态没有消失。
确保用户旋转屏幕不会丢失之前的操作状态。
接下来的课程中你将学习到,activity可以在不同的生命周期中切换状态,就像上图展示的那样。然而,activity只能停留在三种状态上:
Resumed
在该状态下,activity处于前台且可以与用户交互(有时也称为“running”状态)。
Paused
在该状态下,activity被另一个activity不完全遮挡——另一个activity处于前台,半透明或者没有覆盖整个屏幕。paused activity不接受用户输入,也不执行任何代码。
Stopped
在该状态下,activity完全被遮挡,用户无法看到;可以认为是处于后台。当处于stopped状态,该activity对象以及它所有的状态信息(如成员变量)都是被保留的,但是此时不执行任何代码。
其他状态(Created and Started)都是瞬间状态,处于这些状态下,系统会很快调用下一个生命周期函数并进入下一个状态。即是说,系统调用onCreat()之后,立即调用onStart(),又立即调用onResume()。
指定应用的入口activity
当用户从主界面点击你的应用图标,你声明了“launcher”(or "main")的那个activity的onCreat()方法将被调用。这个activity将是你的程序入口。
你可以在AndroidManifest.xml文件中定义哪个activity作为你的入口activity。
程序的main activity必须在manifest文件中声明。位于<intent-filter>标签下,包括MAIN action以及LAUNCHER category。如:
<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>
如果你的任何activity都既没有声明MAIN action,也没有声明LAUNCHER category,那么你的app图标将不会出现在主界面的app列表里。
新建一个实例
大多数应用都包括数个不同的activity,以便用户进行不同的操作。无论是入口activity还是其他activity,系统都是通过调用activity的onCreate()方法来创建activity对象的。
你必须实现onCreate()方法来执行基本的应用程序启动逻辑,该方法在activity的整个生命周期中只会执行一次。举例来说,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); } }
注意:上例使用SDK_INT来防止旧系统使用新API,这种做法只能用于android2.0(API level 5)或更高,旧版本会抛出一个运行时异常。
一旦onCreate()执行完毕,系统会立即连续调用onStart()和onResume()方法。activity从不在Created或Started状态上逗留。严格意义上来说,当onStart()被调用时,activity已经被用户可见,然后onResume()立即被调用,并且系统将停留在Resumed状态直到某些事件发生,诸如接到来电,打开其他activity,或者设备屏幕被关闭。
销毁Activity
onCreate()是第一个回调方法,而onDestroy()是最后一个。当系统调用该方法时,表示你的activity对象将要从系统内存中彻底移除。
大多数app不需要实现该方法,因为本地类引用将随activity一同被销毁,并且,你的activity应该在onPause()以及onStop()时执行几乎所有的清理工作。然而,如果你的activity包含了一些在onCreate()阶段创建的后台线程,或者其他一些长期运行的资源,如果没有正确关闭有可能造成内存泄露,那么,你应该在onDestroy()阶段kill掉它们。
@Override public void onDestroy() { super.onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate() android.os.Debug.stopMethodTracing(); }
注意:系统总是在调用onPause()和onStop()之后才调用onDestroy(),只有一种例外:你在onCreate()中调用了了finish()。某些情况下,比如你的activity运行只是为了选择打开另一个activity,你可能会在onCreate()中调用finish()来销毁activity。这种情况下,系统直接调用onDestroy()而不会调用其他任何生命周期函数。

浙公网安备 33010602011771号