Android活动Activity
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显示的文本。