本实验中,你将学习到Android四大组件之一的Activity。你了解其主要的生命周期,并实际创建一个项目来使用Activity。
- Activity的功能和作用
- Activity的生命周期
- 在Android Studio中创建Activity
- 使用Logcat
请打开桌面上的Android Studio,新建一个名为ActivityPractice
的项目,域名填写shiyanlou.com
(即包名为com.shiyanlou.activitypractice
。项目最小SDK版本(minSDK
)请选择Android 5.1
,并选择Blank Activity
作为模块创建一个Activity,其它选项使用默认值即可。
等待项目创建完成后,请在AVD中创建一台模拟器并启动。
推荐的模拟器参数:
- 硬件平台:Nexus S (屏幕分辨率480*800)
- 系统版本:Android 5.1.1 armeabli-v7a
- 请去掉
Use Host GPU选项
模拟器的启动时间约为6分钟,这段时间你可以回到Android Studio继续学习和编码。
上述过程如果你不是很会,可以参考课程《Android Studio项目创建和模拟器配置》。
Android中有四大组件,分别是Activity、Service、ContentProvider和Broadcast Receiver。对于Activity,它是Android系统中最常用、最常见的一个组件。一个应用通常包含了多个Activity。
一个Activity代表了一个具有用户交互接口的单个屏幕画面,这类似于Java里的Window
或者Frame
。Android的Activity是ContextThemeWrapper
类的子类。如果你有C、C++或者Java语言的编程经验,你一定知道你的主程序运行起来时,是从main()
方法开始的。十分类似的是,Android系统在Activity中初始化自己的程序是从一个叫onCreate()
的回调方法开始的。回调方法的序列能让一个Activity启动,也能让一个Activity关闭,如下图所示的Activity生命周期。
Activity类定义了如下的回调事件,你不必在实际的项目中去实现所有的回调方法。但是很重要的一点是,你可能需要理解并实现它们,以确保你的应用能够按照用户所期待的那样来表现功能。
这些方法如下所示:
onCreate()
:这是第一个回调方法。当Activity首次被创建时会调用它。onStart()
:当Activity对于用户来说变为可视状态时会回调此方法。onResume()
:当用户开始与应用交互时会调用此方法。onPause()
:当前的Activity正在暂停中,并且先前的Activity正在恢复时,被暂停的这个Activity不会再接收用户的输入,也不再执行任何代码和调用。onStop()
:当Activity不再为可视状态时会调用该回调方法。onDestroy()
:该方法会在Activity被系统销毁前被调用。onRestart()
:当Activity在被停止后重新启动时,会调用该回调方法。
下面我们来动手做一个实例。这个实例将会通过几个简单的步骤来展示Activity的生命周期,你可以继续使用上一节课程中创建的HelloWorld
项目。
- 请用Android Studio创建一个名为
ActivityPractice
的Android应用项目,包名为com.shiyanlou.activitypractice
。如果已经创建了请忽略此步骤,如果不太会的话请回到上一节。 - 按照后文所示的那样来修改
MainActivity.java
中的内容,请保持该文件中的余下内容不被修改。 - 请编译并运行这个应用,在Android模拟器中(你应该在本实验一开始就创建好了)启动它,然后检验我们在这个应用中的所作所为是正确的。
下面给出了src/com.shiyanlou.activitypractice/MainActivity.java
中的代码内容。这个文件包含了Activity的基本的生命周期中的每一个方法。此处用到了Log.d()
方法,它可用于产生日志信息,你可以在Logcat
中看到这些信息。对于Logcat
的详细解释你可以查看博文《Log图文详解》。
package com.shiyanlou.activitypractice;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
public class MainActivity extends Activity {
String msg = "Shiyanlou :";
// 当Activity首次启动时会调用onCreate()方法
// 可以简单理解为传统java程序中的main()方法
// 通常你需要重写这个方法,在其中加载界面的布局,初始化各类控件等
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The function onCreate() was called.");
}
// 当Activity即将变得可见时会调用onStart()方法
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The function onStart() was called.");
}
// 当Activity已经变得可见时会调用onResume()方法
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The function onResume() was called.");
}
// 当其他的Activity已经获得了焦点时会调用onPause()方法
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The function onPause() was called.");
}
// 当Activity不再可见的时候会调用onStop()方法
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The function onStop() was called.");
}
// 当Activity被销毁的时候会调用onDestroy()方法
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The function onDestroy() was called.");
}
}
一个Activity类会通过XML文件(该文件在项目的res/layout
目录中)来加载所有的UI组件,下面这行代码从res/layout/activity_main.xml
文件中加载UI组件。
setContentView(R.layout.activity_main);
一个应用可以有一个或多个Activity,这没有任何限制。你在应用中定义的每个Activity都必须在项目的AndroidManifest.xml
文件中声明。并且,应用中的主Activity(你可想象成主界面)在声明时还必须注明<intent-filter>
标签,这个标签中包括了MAIN
动作(action
)和LAUNCHER
目录(category
),如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shiyanlou.activitypractice" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<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>
</application>
</manifest>
如果你需要创建更多的Activity,右键点击项目目录,在菜单中选择New->Activity
即可,如下图所示:
如果一个应用没有任何一个Activity在声明时被注明上述两个标记,那么这个应用的图标将不会出现在主屏幕的应用列表中(不被系统所识别)。
下面请尝试运行刚刚做好的这个ActivityPractice
(或者HelloWorld
)应用。
点击Android Studio上方的运行按钮。
此时项目进入编译状态,编译完成后会弹出Choose Device
选择设备对话框,点击下方OK
按钮。
如果没有可用的设备,则需要在Android Device Monitor
中创建一台模拟器。
等待应用安装至模拟器,此时我们来说下怎样查看Logcat的消息。
在Android Studio的下方,有一个类似于控制台的消息窗口,如图所示:
点击带有绿色安卓小人图标的Android
选项卡,就能切换到Logcat标签页,如下图所示:
在Logcat窗口的右上角搜索框内输入关键字,就能过滤出你想要的信息。当然不要忘了选择左边的Log level
选择为Debug
,因为我们用的是Log.d()
方法。
回到模拟器,可以发现应用已经启动好了。我们在Logcat的关键字过滤中输入刚刚定义log信息时写的shiyanlou
,如图所示:
从上图的信息中我们可以看到,MainActivity
在启动过程中经历了onCreate()
、onStart()
和onResume()
三个生命周期。
接下来,在模拟器上点击各个按键,看下你在执行各个操作时,Logcat中都显示了这个应用经历了哪些生命周期。
按键的位置如下图所示:
在你按了主页键
之后,系统就会返回桌面,此时你可以从应用菜单中再次点击ActivityPractice
图标回到这个应用。
同时也不要忘了观察执行这些操作时,Logcat中都出现了哪些信息。
至此,实验已经完成。
作为基础课,我们主要是通过实际的操作来体会各个生命周期回调方法的作用和调用的时机。因此,熟练地掌握其生命周期是非常重要的。关于Activity更加详细地用法将在今后的课程中提供。
请查阅文档,了解如何使用Bundle在Activity之间交换数据。
我们在第四节会对该知识点进行讲解。
稍后在实验楼也会上线该作业相关的项目课,请保持关注。