跟Google学习Android开发-起始篇-管理活动的生命周期(1)

来源:互联网 发布:mac lamp 一键安装包 编辑:程序博客网 时间:2024/04/30 10:16

2 管理活动的生命周期


当用户浏览、离开、重新回到你的应用程序,你的应用程序的 Activity实例在其生命周期的不同状态之间转换。例如,当您的活动的第一次启动时,它来到系统的前台,并接收用户关注。在这个过程中,Android系统对活动调用了一系列的生命周期方法,在活动中设置了用户界面和其他组件。如果用户执行一个动作启动另一个活动或切换到另一个应用程序,在活动移动到后台时(此时活动不再可见,但实例及其状态仍然完好),系统会调用它的另外一组生命周期方法。

在生命周期回调方法中,你可以声明当用户离开并重新进入活动时你的活动的行为方式。例如,如果你正在构建一个流媒体视频播放器,当用户切换到另一个应用程序时,你可能会暂停视频并终止网络连接。当用户返回时,你可以重新连接到网络,并允许用户从相同的位置恢复播放视频。

这个课程讲解了每个Activity实例接收的重要生命周期回调方法,以及你如何使用它们让你的活动以用户期望的方式执行,并在活动不需要时不消耗系统资源。


课程


启动活动

学习活动的生命周期用户如何启动你的应用程序以及如何执行基本活动的创建的基本知识

暂停和恢复活动

了解当你的活动被暂停部分遮盖和恢复发生了什么,以及在这些状态变化中你应该做什么

停止和重新启动活动

了解当用户完全离开你的活动回到它时发生了什么

重建活动

了解活动被销毁时会发生了什么,以及你如何能在必要时重建活动的状态

 

2.1启动活动

不像其他的用main()方法启动应用程序的编程范式,Android系统启动Activity实例的代码,是通过调用特定的回调方法,这些方法对应其生命周期特定阶段的。有一组有序的回调方法启动活动,也有一组有序的回调方法拆除活动。

这个课程提供了最重要的生命周期方法的概述,并告诉您如何处理创建一个您的活动新的实例的第一个生命周期回调方法。


了解生命周期回调


在一个活动的生命过程中,系统按照一种类似阶梯金字塔的顺序,调用一组生命周期方法。就是说,活动的生命周期的每个阶段是金字塔上的一个单独的步骤。系统创建了一个新的活动实例时,每一个回调方法就把活动状态向顶部移动一步。金字塔的顶部是活动在前台运行的一个点,用户可以在这里与它进行交互。

当用户开始离开活动时,为了拆除活动,系统会调用其它的方法把活动状态从金字塔向下移动。在某些情况下,活动将只从金字塔向下移动一部分并等待(如当用户切换到另一个应用程序),活动可以从用户离开的地方重新回到顶部(如果用户返回到活动)并恢复。


1简要说明了活动的生命周期,表现为一个阶梯金字塔。它显示出,对于每个让活动移动到恢复状态的回调,都有对应的回调方法让活动状态往下降。活动也可以从暂停和停止状态返回到恢复状态。

根据您的活动的复杂性,你可能并不需要实现所有的生命周期方法。然而,重要的是你了解它们的每一个,并实现那些用来确保您的应用程序按照用户期望的方式执行的方法。正确地实现您的活动的生命周期方法,确保您的应用程序的行为在以下几个方面表现很好:

·      当使用您的应用程序时,如果用户收到一个电话或切换到另一个应用程序,你的应用程序不会崩溃

·      当用户没有活跃地使用它时,不消耗宝贵的系统资源

·      当用户离开你的应用程序并在以后的时间返回到它时,不失去他们的进度

·      当屏幕在横向和纵向之间旋转时,不会崩溃或失去用户的进度

在你将要学习的以下课程中,有几种情况下,一个活动会像图1所示那样在不同状态之间转换。然而,其中只有三个状态是静态的。即,在相当长的一段时间内,活动可以停留在三种状态中的某一个:


恢复

在这种状态下该活动是在前台并且用户可以与它进行交互有时也被称为运行状态

暂停

在这种状态下活动被另一个活动部分遮蔽——另一个在前台的活动是半透明或不覆盖整个屏幕的暂停的活动不接收用户输入,也不能执行任何代码

停止

在这种状态下该活动是完全隐藏对用户是不可见的它被认为是在后台中停止时活动实例及其所有状态信息如成员变量)都会被保留但它不能执行任何代码


其它状态(创建和启动)是瞬时的,通过调用下一个生命周期回调方法,系统将迅速从这些状态移动到下一个状态。也就是说,在系统调用onCreate()方法后,会马上调用OnStart()方法,紧接着是onResume()方法

这就是基本的活动生命周期。现在,你要开始学习一些特定的生命周期行为。


指定你的应用程序的启动活动


当用户从主屏幕中选择你的应用程序图标后,系统调用您的应用程序中的活动onCreate()方法,这个活动是你已经声明为启动(或)的活动。这个活动作为您的应用程序的用户界面的主要切入点。

您可以在Android主清单文件中定义使用哪个活动为主要活动,AndroidManifest.xml文件在你的项目根目录下。

你的应用程序的主活动,必须在主清单文件中通过<intent-filter>标签声明,<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类。

如果主活动或启动类别之一没有在你的所有活动中的任意一个里声明,那么你的应用程序的图标将不会出现在主屏幕的应用程序列表上。


创建一个新的实例


大多数应用程序包括几个不同的活动,允许用户执行不同的操作。无论是用户点击你的应用程序图标生成的主活动,还是为了响应用户操作而启动的不同活动,系统都通过调用onCreate()方法创建每一个新的Activity实例。

您必须实现onCreate()方法来执行基本的应用程序的启动逻辑,这些启动逻辑在整个生命活动应该只发生一次。比如,可以在你的onCreate()方法的实现中,定义用户界面,并可能实例化一些类范围的变量。

例如,下面的例子的onCreate() 方法展示了一些代码,这些代码为活动进行一些基本的设置,如用户界面(在XML布局文件中定义)声明,定义成员变量和配置的某些UI

TextView mTextView;// Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    // Set theuser interface layout for this Activity
    // The layoutfile is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
   
    // Initializemember TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
   
    // Make surewe'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工作只在Android 2.0API 5级)和更高版本可用。旧版本会遇到运行时异常。

onCreate()方法执行完毕后,系统快速地先后调用OnStart()onResume()方法。您的活动从来没有驻留在创建或启动状态。从技术上说,OnStart()被调用时活动变得对用户可见,但紧接着onResume()方法就被调用,然后活动停留在恢复状态,直到发生某些事情改变它,如当收到一个电话,用户导航到其他活动,或者设备屏幕关闭。

在接下来的其他的课程中,你会看到其他启动方法onStart()onResume(),用于从暂停或停止状态恢复活动时,在您的活动的生命周期是如何有用的。

注:onCreate() 方法包含的参数叫做savedInstanceState,它会在后面的课程“重建一个活动”中讨论。


2另一个活动的生命周期结构的展示,它突出了创建一个新活动实时时,系统依次调用的三个主要回调方法:onCreate()onStart()onResume()。当这个有序的回调完成时,活动到达恢复状态,此时用户可以与活动进行交互直到他们切换到另一个不同的活动


销毁活动


活动的第一个生命周期回调onCreate()方法,而它的最后一个回调 则是OnDestroy()方法。系统对你的活动调用这个方法,作为您的活动实例被完全从系统内存中移除的最终信号。

大多数应用程序并不需要实现这个方法,因为本地类的引用会被活动销毁,而活动应在onPause()onStop()方法中执行大部分清理。但是,如果你的活动包含在onCreate()方法里创建后台线程,或其他长时间运行的资源,而这些资源如果没有正确关闭可能造成内存泄漏的话,你应该onDestroy()方法里杀掉它们。

verride
public void onDestroy(){
    super.onDestroy();  // Always call the superclass
   
    // Stop methodtracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();

注:系统总是在已经调用onPause()onStop()方法之后才调用OnDestroy()方法,除了一种情况:当你onCreate()方法中调用finish()方法。在某些情况下,比如您的活动作为一个临时的决策者来启动另一个活动时,你可能会从活动onCreate()方法中调用finish()方法来销毁活动。在这种情况下,系统会立即调用onDestroy()方法而不用调用任何其他生命周期方法。

原创粉丝点击