Getting Started-----Managing the Activity Lifecycle

          作为一个用户,在你的app里不同的页面和前后台切换时,你的app里的Activity实例在它的生命周期的不同状态间切换。例如,当你的activity第一次启动时,它处于系统前台,接受用户焦点。在这处理之间,Android系统调用一系列Activity上生命周期方法,在这些方法里,你可以设置用户界面和初始化其他的组件。如果用户执行一个开启另一个Activity或者切换到其他app的操作,这是当当前activity切换到后台时(activity对用户不再可见,但是实例和它的状态仍然是原封不动的),系统调用另外的一系列的生命周期方法。

       在生命周期回调方法里,你能声明当用户离开和再次进入该activity的行为和操作。例如,如果你正在构建一个流视频播放器,当用户切换到另一个app时,你可能要暂停视频,并中断网络连接。当用户返回时,你能重新连接网络,并允许用户在相同点恢复视频播放。

        本文解释了Activity实例重要的生命周期回调方法。也告诉你如何使用这些方法来达到用户期望的操作和行为,同时如何在Activity不需要它们时不消耗系统资源。

          Lessons

          Starting an Activity

                      Learn the basics about the activity lifecycle, how the user can launch your app, and  how to perform basic activity creation.

           Pausing and Resuming an Activity

                      Learn what happens when your activity is paused (partially obscured) and resumed  and what you should do during these state changes.

          Stopping and Restarting an Activity

                   Learn what happens when the user completely leaves your activity and returns to it.

          Recreating an Activity

                    Learn what happens when your activity is destroyed and how you can rebuild the activity state when necessary.

        

         Starting an Activity

           不像其他的编程学科形态,应用从一个main()方法开始,Android系统的开始代码在一个Activity实例里。 通过调用相应的activity生命周期状态的特点回调方法启动。有一些列的开启activity的回调方法,同时也有一些列的销毁activity的回调方法。

        本文总体介绍了activity最重要的生命周期方法,告诉你怎么处理第一个用于产生一个新的activity的生命周期回调。

        

        Understand the Lifecycle Callbacks

        整个Activity的生命周期里,系统会调用类似于金字塔的一系列核心的生命周期方法。当系统产生一个新的activity实例时,系统会调用每一个回调方法,activty的状态也会一步一步由底向上推进。这金字塔的顶部是activity正运行的前台的那点,用户能和该activity交互。

        当用户开始离开该activity时,系统调用回调一系列其他的方法从金字塔顶部到底部一步一步移动activity的状态,从而销毁一个activity。一些情况下,activity并不完全移到金字塔底的状态,而是等待(例如当用户切换到其他app时),从而在移会到金字塔顶的状态(如果用户返回该activity),恢复到用户离开时的状态。

        

 Figure 1. A simplified illustration of the Activity lifecycle, expressed as a step pyramid. This shows how, for every callback used to take the activity a step toward the Resumed state at the top, there's a callback method that takes the activity a step down. The activity can also return to the resumed state from the Paused and Stopped state.

          是否需要实现所有的生命周期方法取决于你的activity的复杂性。然而,理解每一个生命周期方法并实现必要的生命周期方法时重要的。合理的实现activity生命周期方法能确保你的app行为在如下几个方面表现很好:

  • 当用户接电话或者切换到另一个app时不至于crash。
  • 当用户不使用该activity时,不占用有价值的系统资源
  • 当用户离开你的app,以后返回后,不丢失用户工作
  • 当横竖屏切换时,不crash或者不丢失用户工作

        本文将告诉你activity在如上图1中的不同状态切换的一些场景。然而,这些状态中,仅仅有3个是静态的。那即是,activity仅仅能在这三个状态时长时间存在:

        Resumed

              在该状态,activty处在前台,用户能和它交互。(有时也称为“running"状态)。

        Paused

              在该状态,activity是部分可见的,一部分被另一个activity遮挡——其他的activity在前台,是半透明            的,或者并没有完全覆盖整个屏幕。处于暂停状态的activity不会收到用户输入,也不能执行任何代码。

       Stopped

             在该状态,activity被完全的隐藏,对用户不可见;被认为是在后台。当处在该状态时,activity实例和它的所有的状态信息,例如成员变量等将被保持,但是也不能执行任何代码。

        其他的状态(Created和Started)是短暂的、非持久化的,系统会回调下一个生命周期方法很快的从这两个状态移到下一个状态。即:系统调用完onCreate()方法后,很快的调用onStart()方法,接着又很快的调用的onResume().

        这是最基本的activity生命周期。下面将讲述一些状态里该进行的生命周期行为。

        Specify Your App’s Launcher Activity

        当用户从手机的Home屏幕选择你的app时,系统会调用你的app里被声明为”launcher“(或者”main“)的activity的onCreate()方法。该Activity作为进入你的app用户界面的主入口。

        你的app的主Activity必须在manifest文件里声明。主activity的声明必须包含一个<intent-filter>元素,该元素里包含  MAIN action和 LAUNCHER category,例如:               作为一个用户,在你的app里不同的页面和前后台切换时,你的app里的 Activity实例在它的生命周期的不同状态间切换。例如,当你的activity第一次启动时,它处于系统前台,接受用户焦点。在这处理之间,Android系统调用一系列Activity上生命周期方法,在这些方法里,你可以设置用户界面和初始化其他的组件。如果用户执行一个开启另一个Activity或者切换到其他app的操作,这是当当前activity切换到后台时(activity对用户不再可见,但是实例和它的状态仍然是原封不动的),系统调用另外的一系列的生命周期方法。
<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         Create a New Instance         一般地,app都包含处理用户不同的action的一系列的activity。不管这些activity是不是主activity,系统都通过调用onCreate()方法产生Activity的实例。         你必须实现onCreate方法执行基本的app开始逻辑。这些逻辑应该仅仅在activity的整个生命周期里发生一次。例如,你的Oncreate()实现应该定义用户界面,同时可能实现类范围的类变量。        例如,下面的onCreate()方法代码例子执行了基本的activity的setup,例如声明用户界面(被定义在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。但SDK_INT从Android 2.0(API 5)才出现。旧版本使用将产生runtime异常。         一旦OnCreate()执行完成,系统很快的接着连续调用onStart()和OnResume()方法。你的Activity将重不可能停留在Created或者Started状态。学术上,当OnStart()调用后,activity变得对用户可见,但很快的OnResume()方法被调用,activity停留在Resumed状态,直到其他的改变发生,例如,接到一个来电,用户切换到其他的activity的,或者设置黑屏。       注:OnCreate方法有一个参数:savedInstanceState。这将在后面的章节Recreating an Activity里讨论      

  Figure 2. Another illustration of the activity lifecycle structure with an emphasis on the three main callbacks that the system calls in sequence when creating a new instance of the activity:  onCreate()onStart(), and  onResume(). Once this sequence of callbacks complete, the activity reaches the Resumed state where users can interact with the activity until they switch to a different activity.  

             Destroy the Activity

             当activity的第一个生命周期回调方法时onCreate(),它对应的最后一个回调是onDestroy()。系统调用onDestroy()方法作为activity完全消耗的标志。那即意思,Activity正完全地从系统内存中移除。             大多数应用不需要实现onDestroy()方法,因为本地类引用(Activity里的类)随着Activity一起被消耗,你的Activity应该在onPause()和onStop()里执行大部分的cleanup工作。然而,如果你的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方法,而没有调用任何其他的生命周期方法                          

猜你喜欢

转载自xhmj12.iteye.com/blog/2081872