Android学习路线(十二)Activity生命周期——启动一个Activity
2014-08-08 08:22
721 查看
DEMO下载地址:http://download.csdn.net/detail/sweetvvck/7728735
不像其它的编程模式那样应用是通过
本课展示了大多数重要生命周期方法的预览,并且告诉你如何处理第一个生命周期方法来创建一个新的activity实例。
在activity的一生中,系统按照类似金字塔的次序调用核心生命周期方法。就像这样,activity生命周期的每个阶段就是金字塔的每个台阶。当系统创建一个新的activity,每个回调方法将activity的状态向顶端移动一步。金字塔的顶端对应着运行在应用前台的activity,这时用户能够与它交互。
当用户准备离开这个activity时,系统会调用另外一些方法来将activity的状态向金字塔下移动,从而销毁这个activity。在一些情况下,activity只会向下移动一半然后等待(例如用户切换到其他的应用中),这样这个activity就可以再次出现到顶部(如果用户回到这个activity)同时恢复用户离开时的状态。
![](http://img.blog.csdn.net/20140808081714078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3dlZXR2dmNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 1. 一个简单的android声明周期插图,像一个金字塔的样子展现。它展示了每个方法被调用后是如何带着activity到达金字塔的顶部Resumed状态的,同样也有方法让activity下一级台阶。这个activity在被Paused和Stopped状态下同样也能再次回到Resumed状态。
由于这些的复杂性,你并不需要实现所有的生命周期方法。然而,你要确保你的应用会像用户期待的那样表现,理解和实现每个方法是十分重要的。适当地实现activity的生命周期方法可以通过几种方式来保证你的应用表现得很好,包括下面几点:
当用户在使用你的应用时接到电话或者切换到其它应用时不要崩溃。
当用户没有在使用你的activity时不要消耗珍贵的系统资源。
如果用户离开你的应用然后过一段时间返回来后不要丢失用户的进度。
屏幕横竖屏切换时不要丢失用户的进度更不要崩溃。
你将会在接下来的课程中学到,activity像插图1那样在不同状态下切换有多种情况。然而,它们之中只有三种状态是静态的。就像这样,activity可以在这三种状态之一中保存一段较长时间:
Resumed在这个状态下,activity是在前台的,用户能够跟它进行交互。(有时候也被称为"running" 状态。)Paused在这个状态下,activity被另一个activity遮住了一部分——这里指的另一个activity是半透明的或者没有覆盖整个屏幕。处于paused状态的activity不能接收任何用户输入也不能执行任何代码。Stopped在这个状态下, 这个activity被完全地隐藏了;可以理解为在后台。在stopped过程中,activity实例以及它的所有状态信息例如成员变量都被保存起来了,但是它不能执行任何代码。
其他的状态(Created 和 Started)是瞬时状态,系统会在调用下一个生命周期方法来让此状态转移到下一个状态。就这样,当系统调用
上面就是基本的activity的生命周期方法。现在你将要开始学习一些特定的生命周期方法的行为。
当用户在设备主界面选择你的应用图标时,系统会调用
你可以在manifest中定义哪个activity作为应用启动的activity,在项目根目录下的
这个你应用的主activity必须在manifest 文件中声明
和
提示: 当你通过Android SDK工具创建一个新的Android项目时,默认的项目文件会包含这个
如果在你的所有activity中,
或者
都没有被声明,那么你的应用的icon将不会出现在设备的主界面上。
大多数的应用都包含几个不同的activity,让用户执行允许用户执行不同的错啊做。不管这个activity是不是当点击应用图标时被创建的主activity还是响应用户操作开启的activity,系统都会通过调用它的
你必须实现
例如,下面的
注意: 使用
一旦
在接下来的课程里,你将会看到其它的方法,
提示:
an Activity。
![](http://img.blog.csdn.net/20140808081744718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3dlZXR2dmNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 2. 另一个activity声明周期结构的插图,在系统创建一个activity的新实例时所调用的回调方法(
和
大多数的应用不需要实现这个方法,因为本地的类引用将会和activity一起被销毁,并且你的activity在
提示: 系统在所有的情况下都会在执行完
不像其它的编程模式那样应用是通过
main()函数启动的,Android系统通过调用特定的回调方法对应着特定的生命周期阶段,来初始化一个
Activity实例中的代码。有一系列的方法来启动一个activity,同时也有一系列的方法来销毁activity。
本课展示了大多数重要生命周期方法的预览,并且告诉你如何处理第一个生命周期方法来创建一个新的activity实例。
理解生命周期方法
在activity的一生中,系统按照类似金字塔的次序调用核心生命周期方法。就像这样,activity生命周期的每个阶段就是金字塔的每个台阶。当系统创建一个新的activity,每个回调方法将activity的状态向顶端移动一步。金字塔的顶端对应着运行在应用前台的activity,这时用户能够与它交互。当用户准备离开这个activity时,系统会调用另外一些方法来将activity的状态向金字塔下移动,从而销毁这个activity。在一些情况下,activity只会向下移动一半然后等待(例如用户切换到其他的应用中),这样这个activity就可以再次出现到顶部(如果用户回到这个activity)同时恢复用户离开时的状态。
图 1. 一个简单的android声明周期插图,像一个金字塔的样子展现。它展示了每个方法被调用后是如何带着activity到达金字塔的顶部Resumed状态的,同样也有方法让activity下一级台阶。这个activity在被Paused和Stopped状态下同样也能再次回到Resumed状态。
由于这些的复杂性,你并不需要实现所有的生命周期方法。然而,你要确保你的应用会像用户期待的那样表现,理解和实现每个方法是十分重要的。适当地实现activity的生命周期方法可以通过几种方式来保证你的应用表现得很好,包括下面几点:
当用户在使用你的应用时接到电话或者切换到其它应用时不要崩溃。
当用户没有在使用你的activity时不要消耗珍贵的系统资源。
如果用户离开你的应用然后过一段时间返回来后不要丢失用户的进度。
屏幕横竖屏切换时不要丢失用户的进度更不要崩溃。
你将会在接下来的课程中学到,activity像插图1那样在不同状态下切换有多种情况。然而,它们之中只有三种状态是静态的。就像这样,activity可以在这三种状态之一中保存一段较长时间:
Resumed在这个状态下,activity是在前台的,用户能够跟它进行交互。(有时候也被称为"running" 状态。)Paused在这个状态下,activity被另一个activity遮住了一部分——这里指的另一个activity是半透明的或者没有覆盖整个屏幕。处于paused状态的activity不能接收任何用户输入也不能执行任何代码。Stopped在这个状态下, 这个activity被完全地隐藏了;可以理解为在后台。在stopped过程中,activity实例以及它的所有状态信息例如成员变量都被保存起来了,但是它不能执行任何代码。
其他的状态(Created 和 Started)是瞬时状态,系统会在调用下一个生命周期方法来让此状态转移到下一个状态。就这样,当系统调用
onCreate(),它马上会调用
onStart()方法,他后面很快被接着
onResume()方法。
上面就是基本的activity的生命周期方法。现在你将要开始学习一些特定的生命周期方法的行为。
指定你的应用的启动Activity
当用户在设备主界面选择你的应用图标时,系统会调用onCreate()方法,它是你声明作为应用启动
Activity中的方法。它是一个作为进入应用UI的入口activity。
你可以在manifest中定义哪个activity作为应用启动的activity,在项目根目录下的
AndroidManifest.xml文件。
这个你应用的主activity必须在manifest 文件中声明
<intent-filter>元素,同时该元素要包含
MAINaction
和
LAUNCHERcategory。例如:
<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并且已经声明好了这个filter。
如果在你的所有activity中,
MAINaction
或者
LAUNCHERcategory
都没有被声明,那么你的应用的icon将不会出现在设备的主界面上。
创建一个新的实例
大多数的应用都包含几个不同的activity,让用户执行允许用户执行不同的错啊做。不管这个activity是不是当点击应用图标时被创建的主activity还是响应用户操作开启的activity,系统都会通过调用它的onCreate()方法为每个activity创建实例。
你必须实现
onCreate()方法来执行基本的应用启动逻辑,这在应用的整个生命周期中只会出现一次。例如,你对
onCreate()方法的实现中需要定义UI以及实例化一些可能存在的类变量。
例如,下面的
onCreate()方法的例子展示了一些执行activity基本的启动代码,例如声明UI(在一个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来阻止老系统执行新的APIs。老版本的系统执行新APIs将会导致一个运行时异常。
一旦
onCreate()结束执行,系统会很快调用
onStart()方法和
onResume()方法。你的activity绝不会停留在Created或者Started状态下。从技术角度来看,当onStart()方法被调用时,这个activity对用户可见了,但是紧接着
onResume()方法被调用后这个activity会一直保持在Resumed状态下,直到一些事情改变了它们,例如当来了一个电话时,用户导航到其他的activity上,或者设备的屏幕被关闭。
在接下来的课程里,你将会看到其它的方法,
onStart()和
onResume()在被用来resume来自Pasued或者Stopped状态下的activity是如何起作用的。
提示:
onCreate()方法包含了一个被称为
savedInstanceState的参数,这个参数将会在后边的课程中介绍:Recreating
an Activity。
图 2. 另一个activity声明周期结构的插图,在系统创建一个activity的新实例时所调用的回调方法(
onCreate(),
onStart(),
和
onResume())被强调出来。一旦这个回调序列结束,activity将会处于Resumed状态直到他们切换到另一个activity中。
销毁Activity
Activity的第一个回调方法是onCreate(),它的最后一个回调方法是
onDestroy()。系统会在你的activity中调用这个方法最为结束信号,你的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(); }
提示: 系统在所有的情况下都会在执行完
onPause()和
onStop()后调用onDestroy()方法,除了一个例外:当你在onCreate()方法中调用了
finish()方法。这一些情况下,例如你的activity被用来做临时的跳转,你需要在onCreate()方法中调用
finish()来销毁这个activity。在这种情况下,系统立刻就执行了
onDestroy()方法,而没有执行其它任何生命周期方法。
相关文章推荐
- Android学习路线(十二)Activity生命周期——启动一个Activity
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
- Android学习路线(十四)Activity生命周期——停止和重启(Stopping and Restarting)一个Activity
- Android学习路线(十四)Activity生命周期——停止和重新启动(Stopping and Restarting)一个Activity
- Android学习路线(十一)管理Activity的生命周期
- Android应用开发学习之启动另外一个Activity
- 【幻化万千戏红尘】qianfeng-Android-Day05-Activity生命周期,Actitity的启动模式基础学习:
- Android开发笔记----Activity再学习(生命周期、启动模式、intent-filter)
- 【android学习】一个APK的Activity启动另一个APK的Activity
- Android学习路线(十一)管理Activity的生命周期
- android 学习activity生命周期和启动模式
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity
- Android应用开发学习笔记之启动另外一个Activity
- Android高手进阶教程(十二)之----Android 在一个应用中如何启动另外一个已安装的应用!!!
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android 学习历程之二 如何在一个Service中调用Activity(Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
- Android中的Activity生命周期学习
- 老罗的Android之旅——Android应用程序的Activity启动过程简要介绍和学习计划
- Android应用程序的Activity启动过程简要介绍和学习计划