Activity的生命周期(一)

来源:互联网 发布:java防止xss攻击代码 编辑:程序博客网 时间:2024/05/21 21:37
#启动Activity———-***注:翻译自官方文档的API level 21***  不像其他的程序,程序从main()函数启动,Android系统通过回调与特定状态相关的方法来初始化代码。Android系统中有一系列的回调函数(callback methods)来启动一个activity,还有一系列的回调函数用来销毁activity。##理解回调函数的生命周期  在一个activity的生命周期中,系统像登金字塔一样有序调用一系列的生命周期方法。也就是说,activity生命的每一阶段就是登金字塔单独的一步。系统每创建一个新的activity实例,每个回调函数就将activity的状态向金字塔顶移动一步。Activity位于塔顶时,则该activity运行在前台,并且可以与用户进行交互。  当用户离开这个activity时,为了销毁这个activity,系统调用其他的方法将这个activity的状态从金字塔顶向塔底移动。在某些情况下,activity的状态只会从塔顶部分下移,并且处于等待状态(比如说,当用户切换到另外一个APP时),在这种状态下,这个activity又可以回到顶部(用户返回到这个activity时)并且恢复到用户离开的位置。

图1 一个简化的activity生命周期实例,表示上面说到的金字塔。这表明了每一个回调函数怎样使activity移动到下一个状态,恢复到顶部的状态,从顶部向下走。这个activity也可以从暂停和停止状态恢复。

  根据你的activity的复杂度,你也许不用实现所有的生命周期方法。但是,你必须理解每一个方法并实现它们,以确保你的程序可以按照用户希望的方式运行。实现你的activity生命周期方法可以确保你的APP在多种情形下正常运行,包括:

  • 当用户正在使用你的APP时,突然接到电话或者切换到了其他的APP,你的APP不会崩溃;
  • 当用户没有活跃地使用你的APP时,不去消耗宝贵的系统资源;
  • 当用户离开你的APP,再回来时,不会丢失之前的进度;
  • 当屏幕在横屏和竖屏之间切换时,程序不会崩溃或者丢失用户的进度。

  你会发现,activity在图1中显示的状态之间切换的情形会有好几种。
然而,只有三种状态是静态的。也就是说,在一段时间内,activity仅可以以这三种状态中的其中一种存在:

  • 恢复(Resumed)

    在这种状态下,activity是处于前台可见的,用户可以与之交互。(有时候这种状态也指代“运行”态。)

  • 暂停(Paused)

    在这种状态下,这个activity被其他的activity部分遮挡——这个遮挡的activity是半透明的或者没有没有完全覆盖屏幕。这个处于paused状态下的activity不能接受到用户的输入,也无法执行任何代码。

  • 停止(Stopped)

      这种状态下,activity被完全隐藏并且对用户不可见;它被认为是隐藏在后台。当处于停止(Stopped)状态时,这个activity实例和它的所有状态信息,比如说成员变量被保留着,但是它不能执行任何代码。

  其他的状态(创建(Created)和开始(Started))是瞬态的,系统通过调用其他的回调函数快速经过这些状态。也就是说,当系统调用onCreate()方法时,紧跟着就执行onResume()方法前面的的onStart()方法。
这就是activity的基本生命周期。现在你将会学到一些特定的activity生命周期行为。

明确你的APP的启动activity

  当用户在主屏幕上点击你的APP的图标时,系统调用你声明为“启动”(或“主”)activity的onCreate()方法。这是充当为你的APP主要用户接口的activity。

  你可以在Android配置文件AndroidManifest.xml中定义哪一个activity是主activity,这个文件在你工程的根目录下。

  你的APP的主activity必须在配置文件中通过包含主活动(MAIN action)和启动目录(LAUNCHER category)的<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>

Note:当你通过Android SDK工具创建一个一个新的工程时,默认的工程文件包含一个activity类,这个类在配置文件中已经通过过滤器(filter)声明了。

  如果你的activity中,主活动(MAIN action)和启动目录(LAUNCHER category)中的任何一个没有声明的话,你的APP图标都不会出现在主屏幕的APP列表中。

创建一个新的实例

  大多数APP都包含着几个不同的activity,他们能使用户做出不同的活动。不管这个activity是用户点击APP图标时创建的主activity,抑或是为响应用户的动作而开始的其他activity,系统都是通过调用onCreate()方法来创建每一个activity实例。

  为执行基本的程序启动逻辑,你必须实现onCreate()方法,这个方法在activity的生命周期内置被调用一次。比如说,你在onCreate()方法中应该定义用户接口,可能还应该实例化一些类的成员变量。

  举例来说,下面例子的onCreate()方法中的代码实现了activity启动时的一些方法,比如声明用户接口(在xml布局文件中定义),定义成员变量,并且配置了UI的一些属性。

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);    }}

注意:使用SDK_INT来避免旧的系统执行新系统的代码,这样,这样程序就只能在Android 2.0(API 5)或者更高的版本执行。否则,旧版本的系统会抛出运行时异常(runtime exception)。

  一旦onCreate()方法执行结束,系统迅速执行onStart()和onResume()方法。你的activity永远都不会停留在创建(Created)和开始(Started)状态。专业一点来讲,当onStarted()方法被调用时,activity就变得对用户可见了,但是onResume()方法会迅速地紧跟着被调用,并且activity停留在恢复(Resumed)状态,直到发生某个变化,比如有一个电话打进来,用户切换到其他activity,或者设备的屏幕关了。

Note:onCreate()方法有一个参数是savedInstanceState,这将会在后面的Recreating an Activity中讲到。


图2 另一个activity实例的生命周期结构,强调了创建activity实例时调用的三个主要方法onCreate(), onStart(), 和onResume(),一旦这三个方法调用完成,activity就到达恢复(Resumed)状态,这时用户可以与这个activity进行交互,知道用户切换到另一个activity。

销毁Activity

  Activity的生命周期中调用的第一个方法是onCreate(),最后一个方法是onDestory(). 系统调用这个方法,标志着你的activity实例正在被从系统内存中完全移除。

  多数APP没有必要去实现这个方法,因为局部类变量会随着activity一起被销毁,而且你的activity应当在onPause()和onStop()中做好最重要的清除工作。但是,如果你的activity中有一些在onCreate()方法中创建的后台线程或者是其他的长期资源,关闭不合理的话就有内存泄露的可能,这时候你应该在onDestory()方法中杀死它们。

@Overridepublic void onDestroy() {    super.onDestroy();  // Always call the superclass    // Stop method tracing that the activity started during onCreate()    android.os.Debug.stopMethodTracing();}

Note:系统会在已经调用了onPause()和onStop()方法后调用onDestory()方法,但有一种情形除外:当你在onCreate()方法中调用finish()方法时。在某些情形下,比如你的activity用来启动另一个activity,你也许可以在onCreate()方法中调用finish()方法来销毁这个activity。这种情况下,系统会立即调用onDeatory()方法而不调用其他的任何生命周期函数。

0 0
原创粉丝点击