Android活动Activity

时间:2020-01-09 10:33:59  来源:igfitidea点击:

Android活动 Activity是Android应用程序用户界面的一个屏幕。这样,Android活动与桌面应用程序中的Windows非常相似。一个Android应用可能包含一个或者多个活动,即一个或者多个屏幕。 Android应用程序首先显示主要活动,然后从那里开始打开其他活动。

活动生命周期

在Android应用程序中,任何Android活动在其生命周期中都会经历一定的生命周期。此生命周期如下所示:

首次启动Android应用程序时,将创建主要活动。在准备为用户服务之前,该活动将经历3个状态:已创建,已启动和已恢复。

如果主活动可以打开任何其他活动(屏幕),则这些活动在打开时将经历相同的3个状态。

如果活动A打开了另一个活动B,则活动A将被暂停。这意味着活动A进入暂停状态。当用户单击"后退"按钮并返回到活动A时,活动A返回到恢复状态。

如果用户返回到Android设备的主屏幕,则所有活动都将暂停然后停止。如果用户随后返回到该应用程序,则活动将经历开始状态,然后再恢复状态。如果Android设备需要Android应用程序占用其设备内存的内存,则它可能会完全销毁该应用程序,这意味着Android活动进入销毁状态。

请注意,状态始终遵循图中的箭头。活动不能从创建跳转到直接恢复。活动将始终按照该顺序进行创建,开始和恢复。活动可能会从恢复变为暂停,然后再从暂停变为停止,再回到开始,但是永远不会从停止直接变为恢复。

活动生命周期方法

Android应用中的所有活动均由活动类表示。这些活动类是android.app.Activity的子类。 " Activity"类包含一组与活动可以处于的生命周期状态相对应的方法。这些方法是:

  • onCreate()
  • onStart()
  • onRestart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroy()

当活动要转换为生命周期状态之一时,将在"活动"子类实例上调用相应的生命周期方法。当生命周期方法完成时,活动被认为处于新的生命周期状态。例如,一旦onCreate()生命周期方法返回,就假定该活动处于创建状态。

如前所述,所有Android活动都是Activity类的子类。 " Activity"类包含上面列出的生命周期方法。如果活动类在更改生命周期状态时需要做一些特殊的事情,则可以在" Activity"子类中覆盖相应的生命周期方法。实际上,活动类几乎总是需要重写这些生命周期方法中的至少一种。例如,初始化UI或者加载/保存数据等。

小提示:当活动从停止过渡到开始时,将调用onRestart()生命周期方法。在onRestart()之后,生命周期方法onStart()被调用,并且该活动被视为再次开始。

这是一个名为" MyActivity"的" Activity"子类示例,它覆盖了上述所有生命周期方法:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

注意每个生命周期方法如何调用超类中的相应方法。如果" Activity"子类覆盖了生命周期方法之一,则它必须在被覆盖的方法内调用超类中的相应方法。

创建活动

当我们在Android Studio中创建新的Android项目时,该项目将已经包含一个Android Activity类(除非我们选择不应创建活动)。

活动是Android类android.app.Activity的子类。这是一个" Activity"子类外观的示例:

package com.jenkov.myfirstandroidapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MyFirstAndroidActivity extends Activity {

}

这个Activity子类没有做任何有趣的事情。它只是扩展了android.app.Activity。

当我们在Android Studio中创建空白活动时,Android Studio为我们生成的Activity子类如下所示:

package com.jenkov.myfirstandroidapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MyFirstAndroidActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_first_android);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.my_first_android, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

请注意,该" Activity"子类如何覆盖生命周期方法" onCreate()"以及其他两个方法" onCreateOptionsMenu()"和" onOptionsItemsSelected()"。所有这些方法将在以后更详细地介绍,因此在此不再赘述。这时要知道的重要一点是," Activity"子类会覆盖从" Activity"类继承的方法,以便执行任何有趣的操作。

在Android Studio中创建活动

在Android Studio中创建新项目时,新项目对话框将询问我们是否要创建活动作为项目的一部分。如果应用仅需要一个活动(一个屏幕),则无需创建更多的"活动"子类。

但是,如果应用程序需要多个活动,则可以通过选择"新建..."菜单项通过"文件"菜单将活动添加到项目中。在这里可以找到该菜单项:

在打开的菜单中,单击"活动"菜单项,然后选择要创建的活动类型。这是在Android Studio中的外观:

活动XML布局文件

活动可能具有关联的XML布局文件。 XML布局文件指定如何相对于活动呈现活动中的GUI组件。在下面的屏幕截图中,我在Android Studio的项目浏览器中标记了活动类及其关联的布局XML文件:

我们不必为每个活动都拥有一个布局XML文件。活动还可以通过编程方式创建布局(通常从" Activity"子类的" onCreate()"方法内部)。但是,在大多数情况下,使用布局XML文件更容易。布局XML文件使我们可以更改布局,而不必更改Activity子类中的代码。

布局XML文件将在此Android开发教程资源的后续文章中详细介绍,因此在此不再赘述。

onCreate()

"活动"生命周期方法" onCreate()"是创建活动时由Android操作系统调用的第一个方法。在此方法内部,我们应该初始化活动。活动的初始化包括用户界面组件的初始化,以及活动完成其工作所需的任何其他资源。

实际上,一些资源应该在onStart()或者onResume()中初始化,并在onStop()或者onPause()中释放。这取决于在不使用资源时保持开放状态的成本,以及在不使用资源时是否应保持开放状态。

这是默认的onCreate()实现如何查找由Android Studio生成的活动的方式:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_first_android);
}

首先,调用" super.onCreate()"。活动生命周期方法应始终在超类中调用其对应的方法。

其次,调用setContentView()。此方法指定要在活动内显示的视图。一个活动只能包含一个根视图,但是该根视图中可能嵌套有多个视图。在ViewGroups(也就是视图)中嵌套视图是组成更复杂的UI的方式。

传递给setContentView()的参数是一个常量,它指向活动的布局XML文件。在这种情况下,它是常量R.layout.activity_my_first_android。当我创建活动类时,此常量是由Android Studio生成的。实际上,R类中的所有常量都是由Android Studio或者Android SDK根据项目中的文件(布局文件,字符串文件,图像等)生成的。

常量R.layout.activity_my_first_android指向的布局XML文件位于app / src / main / res / layout目录中,并且被称为activity_my_first_android.xml。此屏幕快照说明了该文件在Android Studio项目中的位置:

初始化活动界面

调用setContentView()之后,我们可以初始化活动的GUI组件。这是一个onCreate()实现示例,它初始化了一个TextView组件:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_first_android);

    TextView textView = (TextView) findViewById(R.id.the_text_view);
    textView.setText("I have changed the text!!");
}

findViewById()方法是从Activity类继承的。 findViewById()方法采用View组件的ID作为参数。 id是一个常量,它也位于R类内。在这种情况下,位于R.id.the_text_view中。该常数是根据活动的布局XML文件中" TextView"组件的配置生成的。这是布局XML文件(activity_my_first_android):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MyFirstAndroidActivity">

    <TextView
            android:id="@+id/the_text_view"
            android:text="@string/hello_world"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

</RelativeLayout>

注意" RelativeLayout"元素内的" TextView"元素。 TextView元素具有名为android:id的属性。该属性的值为@ + id / the_text_view。这个属性值指示Android SDK创建一个名为the_text_view的ID常量。 @后面的+是告诉Anroid SDK创建常数的地方。如果" +"不存在,则该属性值将被解释为对在其他位置创建的常量的id的引用。

这个生成的id常量用作前面显示的findViewById()方法调用的参数。由于常量是一个id(@@ id / ...),因此该常量会生成到常量的R.id集合中。

一旦获得对" TextView"组件的引用,就可以使用它上需要的所有初始化方法。在上面的示例中,调用了setText()方法来更改TextView显示的文本。