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

Starting an Activity 前端

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

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

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

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


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

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

根据根据须要建立的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)的课程中讨论。

图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()没有要求任何其余生命周期的方法。 
相关文章
相关标签/搜索