Android开发学习笔记(五):Starting an Activity

Starting an Activity

不像其他的编程模式中,应用程序是由main()方法发起的,Android系统启动代码在一个activity实例通过调用的回调方法,对应于特定阶段的生命周期。有一系列回调方法用于启动一个activity,和一系列回调方法用以拆毁一个activity。

这一课将提供一个生命周期方法的总览,并且告诉你如何处理第一个回调方法,在创建一个新的activity实例时。

了解生命周期回调(Understand the Lifecycle Callbacks)

在一个activity的生命周期中,系统调用的一组核心的生命周期方法序列类似的一个阶梯金字塔。就是说,activity生命周期的每一个阶段是一个单独的步骤的金字塔。为系统创建了一个新的activity实例,每个回调方法移动activity状态的一个步骤对顶部。顶部的塔是在该点的,activity在前台运行,用户可以与它交互。


当用户开始离开activity时,系统会调用其他的(函数)方法,把activity的状态从金字塔向下转移,以拆除这个activity。在某些情况下,活动将只有一部分的方式下锥体等(如当用户切换到另一个应用程序),这一点让activity可以回到顶部(如果用户返回到activity),并能恢复到用户离开时的样子。 

下面是Activity生命周期的一个简单图示,就像一个金字塔一样。这个图示反映出了那些使得activity状态向上的回调方法,也反映了那些使得activity状态向下的回调方法。activity也可以从暂停状态(Paused)或停止状态(Stopped)返回到Resumed状态。

Android开发学习笔记(五):Starting an Activity_第1张图片根据根据需要创建的activity的复杂程度,你可能不需要实现所有生命周期的方法。然而,重要的是你了解每一个执行,以确保您的应用程序的行为方式符合用户的期望。适当地实现你的activity生命周期中的方法,可以确保你的应用程序在以下几个方面表现的好一些:

  • 当用户正在使用你的程序时,突然接听电话或者切换到其它的程序,它不至于会崩溃。
  • 当用户不再使用你的程序时,它不会继续消耗宝贵的系统资源。
  • 当用户暂时离开你的程序,再返回时不会丢失用户的进展。
  • 当手机屏幕横向纵向切换时,它不会崩溃或者丢失用户的进度。

activity在不同的状态之间进行转变时,存在几状况。然而,这些状态中只有三种是静态的(activity可以持续的状态)。换句话说,activity可以在这三种状态之一,存在一段比较长的时间。这三种状态分别是:

重返状态(Resumed
在这个状态,activity处于屏幕最前端,并且用户可以与之进行交互。(有时也被称为“运行”状态。

暂停状态(Paused)
在这个状态,activity被其它的activity部分地遮挡住了。这个其它的activity位于屏幕最前端,要么是半透明的,要么没有占据整个屏幕。被暂停的activity无法接受用户的输入,也不能执行任何代码。

停止状态(Stopped)
在这种状态下,activity是完全隐藏着的,并且用户不可见;这被认为是在背景下。在停止状态中,该activity的实例和它的所有状态信息,例如成员变量,都是保留的,但它不能执行任何代码。

Activity的其他状态(创建Created和开始Started)都是短暂的。系统会通过调用下一个生命周期的回调方法,来使得它们快速转换到下一个状态。换句话说,系统在调用onCreate()方法之后,立马就调用onStart()方法,紧接着就是调用onResume()方法。

这就是Activity最基本的生命周期。现在,你可以开始学习有关的一些具体生命周期行为了。

指定应用程序的启动Activity(Specify Your App's Launcher Activity)

当用户从手机主屏幕上选择你的应用程序图标时,Android系统就会调用一个Activity的onCreate()方法。这个Activity就是你为自己的应用程序指定的那个“launcher”(或“main”)activity。它是你的的应用程序对外用户界面的主要入口。

你可以在Android清单文件(AndroidManifest.xml)中指定哪个activity作为主要activity。这个文件在你项目的根目录下

你必须在清单文件中使用<intent-filter>来声明应用程序的主要activity,同时指定MAIN动作和LAUNCHER类别。例如:

<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类别,那么你的应用程序图标将不会出现在主屏幕的应用程序列表中

创建一个新的实例(Create a New Instance)

大多数应用程序包括几个不同的activity,允许用户执行不同的动作。是否有一个活动的主要活动的创造,当用户点击您的应用程序图标或不同的活动,您的应用程序启动响应用户操作,系统创建新的Activity实例通过调用onCreate()方法。

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

例如,下面例子中的onCreate()方法显示出一些执行activity基本安装的代码,如宣布用户界面(定义在一个布局文件中),定义成员变量,并配置一些用户界面。

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

一旦onCreate()执行完成,系统会接二联三地调用onStart()和onResume()方法。你的activity不会驻留在创建(Created)或开始(Started)状态。技术上,当onStart()方法被调用后,activity就对用户可见了,但紧接着onResume()方法就被调用,activity会保持在恢复(Resumed)状态,直到某个事件发生才引起状态改变,例如当接收到一个电话,或用户导航到其他的activity,或设备的屏幕关闭。

在接下来的其他课程中,你将会看到其他的启动方法,onStart()和onResume()。它们在你的acvitity的生命周期中,被用来从暂停(Paused)或停止(Stopped)状态中恢复activity。

注意:onCreate()方法包括一个参数,名为savedInstanceState。它将在后面有关重建Activity(Recreating an Activity)的课程中讨论。

Android开发学习笔记(五):Starting an Activity_第2张图片

图2是另一个示例,它强调了activity生命周期结构中的三个主要的回调。在创建一个activity的新实例时,系统会依次调用这三个回调函数:onCreate(),onStart(),和onResume()。一旦这一系列回调完成,activity就达到了恢复(Resumed)状态,用户可以与它交互,直到他们切换到一个不同的activity。

Activity的销毁(Destroy the Activity)
------------------------------------------------------------------------------------------------------------------------------------------

正如activity生命周期第一个回调是onCreate(),其最后一个回调是onDestroy()。系统调用这个方法作为最后的信号,你的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();
}
 注意:系统调用ondestroy()后它已经称为onpause()和onstop()在所有情况下只有一个:你打电话时finish()在oncreate()方法。在某些情况下,例如当你的活动可作为临时决定推出另一个活动,你可以称finish()内oncreate()破坏活动。在这种情况下,系统会立即要求ondestroy()没有要求任何其他生命周期的方法。

你可能感兴趣的:(Android开发学习笔记(五):Starting an Activity)