Android培训---启动Activity
本文译自:http://developer.android.com/training/basics/activity-lifecycle/starting.html#lifecycle-states
本课程示例代码:http://download.csdn.net/detail/fireofstar/4874551
跟其他编程语言使用main()方法来启动应用程序不一样,Android系统通过调用Activity实例中对应生存周期的特定的回调方法来启动代码。这些跟Activity绑定的回调方法有一定的启动顺序。
理解生存周期的回调方法
在一个Activity的生存期内,系统会调用一组核心的类似于金字塔阶梯顺序的生存周期方法。也就是说,每个Activity生存周期阶段就是一个独立的金字塔台阶。当系统创建一个新的Activity实例时,每个回调方法会把这个Activity的状态向上移动一个台阶,移到这个金字塔的顶部时,这个Activity就会运行在前台,并且用户可以跟它交互了。
当用户离开这个Activity时,系统会调用另外一组回调方法,按照拆除金字塔的顺序,把该Activity的状态向金字塔的底部转移。在某些情况中,该Activity的状态只会向下移到金字塔的某个台阶并处于等待状态(如用户切换到另外一个应用程序时),从这个状态点,该Activity的状态还可以返回到顶端(如果用户返回这个Activity),并且回到用户离开时的位置。
图1.Activity生成周期的简化表示,类似一个金字塔的台阶。这个显示了,每个回调方法是如何把Activity移到顶部的Resumed状态的,以及如何把Activity移到底部的Destroyed状态。在Paused和Stopped状态,Activity也可以返回到Resumed状态。
根据你的Activity的复杂度,你可能不需要实现所有的生存周期方法。但是重要的是你要理解每个一个回调方法,确保你的应用程序实现那些用户所期望的行为。以下是正确的实现你的Activity生存周期回调方法来确保你的应用程序的行为的方法:
1. 用户使用你的应用程序的时候接听电话或切换到另外一个应用程序,不会让你的应用程序崩溃;
2. 在用户不使用Activity时,不要让它占用有价值的系统资源;
3. 如果用户离开了你的应用程序并稍后返回该应用程序时,不要丢失这个用户的进程;
4. 当屏幕在横竖两个方向旋转时,不要让你的应用程序崩溃或丢失这个用户进程。
在以下的课程中,你会学到Activity在图1所是的不同状态之间是如何切换的。但是这些状态中只有三个状态是静态的。也就是说,该Activity在这三个状态中的一个长期存在。
Resumed
在这个状态中,该Activity在前台,并且用户可以跟它交互(有些参考资料中把它叫做“running”状态)
Paused
在这个状态中,该Activity被另一个Activity部分的遮盖了---另一个在前台的Activity是半透明或没有完全覆盖整个屏幕。被暂停的Activity不会接收用户输入,并且也不执行任何代码。
Stopped
在这个状态中,该Activity被完全隐藏,并且用户不可见,这时它被认为在后台。在Stopped状态时,该Activity的所有状态信息(如成员变量)都会被保留,但它不会执行任何代码。
其他状态(Created和Started)是临时的,并且系统会通过调用下一个生存周期回调方法,快速的从它们转移到下一个状态。也就是说,系统调用onCreate()方法之后,它会快速的调用onStart()方法,然后在快速的调用onResume()方法。
给你的应用程序指定启动Activity
当用户从Home屏幕中选择你的应用程序图标时,系统会调用你在应用程序中声明的“launcher”(或“main”)的Activity的onCreate()方法。这个Activity是你的应用程序的用户界面的主入口。
你可以在你的工程目录的跟目录的清单文件(AndroidManifest.xml)中声明那个Activity做为主Activity。
应用程序的主Activity必须在清单中声明包含MAIN操作和LAUNCHER策略的<intent-filter>元素,如:
<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策略,那么你的应用程序图标就不会显示在应用程序列表的Home屏幕中。
创建一个新的实例
大多数应用程序都会包含几个不同的Activity,以允许用户执行不同的操作。不管是在用户点击应用程序图标时创建的主Activity,还是你的应用程序在响应用户操作时启动的不同的Activity,系统会通过调用onCreate()方法来创建新的Activity实例。
那些在Activity整个生命周期中只执行一次的应用程序启动逻辑,必须在要onCreate()方法来实现。例如,你的onCreate()方法实现应该定义用户界面并尽可能的实例化一些类范围内的变量。
例如,下列onCreate()方法的示例显示了一些创建Activity所要实现的一些基本的代码,如声明用户界面(在XML布局文件中定义的),定义成员变量,配置UI元素等。
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()会紧跟着被调用,并且该Activity会停留在Resumed状态中,直到发生了某些事情来改变这种状态,如电话接入时、用户导航到另外一个Activity或者是屏幕被关闭。
注意:onCreate()方法包含了一个叫做savedInstanceSate的参数,在后续的课程“重建一个Activity”中来讨论。
图2.演示Activity生命周期中三个主要的回调方法,系统创建新的Activity示例是调用顺序是:onCreate()、onStart()、onResume()。一点这个回调顺序执行完成,该Activity就会到达可以跟用户交互的Resumed状态,直到它切换到不同的Activity。
销毁Activity
Activity生存周期的第一个回调方法是onCreate(),它的最后一个回调方法是onDestroy()。系统会在你的Activity的最后时刻调用这个方法,你的Activity实例会被完全的从内存中被删除。
大多数应用程序不需要实现这个方法,因为本地的类引用机制会销毁该Activity,并且在onPause()和onStop()期间执行大多数的清理工作。但是,如果你的Activity包含了在onCreate()期间创建的后台线程,或其他长时运行导致内存泄露而不能被正确关闭的Activity,你就应该在onDestory()期间杀死它们。
@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()方法而不调用其他任何声明周期的回调方法。