1 理解Activity
Activity就是一个包含应用程序界面的窗口,是Android四大组件之一。一个应用程序可以包含零个或多个Activity。一个Activity的生命周期是指从屏幕上显示那一刻起一直到最后隐藏所经历的若干阶段,理解其生命周期对确保应用程序正确的工作是极其关键的。
a.Activity的生命周期
Activity的生命周期中包含三种状态:Resumed状态、Paused状态、Stopped状态,每一个Activity都处于某一个状态。
- Resumed状态,当Activity处于屏幕最前端,此时Actiivity完全显示在用户的界面中,并能获取焦点时,可以响应用户的的触摸屏幕等事件,此时为Resumed状态。
- Paused状态:当Activity被其他Activity遮挡,但是仍然有部分可见,此时为Paused状态;当处于Paused状态时,Activity仍然会更新UI,但是此时不能获取焦点,即不会响应用户触摸、后退等事件。
- Stopped状态:当Activity被另外一个Activity完全遮挡,此时为Stopped状态,Stopped状态并不意味着Activity停止运行,而可以理解为转入后台运行。但是如果系统需要内存,会优先结束停止状态的Activity释放资源,所以在Activity转入停止状态时要对重要数据进行保存。
AppCompatActivity基类定义了管理一个Activity的生命周期的一系列事件:
- onCreate()--当Activity首次被创建时调用。
- onstart()--当Activity对用户可见时调用,此时还不可以进行用户的交互。
- onResume()--在onStart()方法中后调用,开始与用户进行交互。
- onPause()--当用户进入透明的窗口时会被调用,此时可以看见但是没焦点。
- onStop()--当Activity不对用户可见时调用。
- onRestart()--当stop状态返回时进入该界面时调用,然后在进入onResume状态。
- onDestroy()--在Activity被系统销毁(手动或由系统执行以节省内存)前调用。
下面两图展示了Activity生命周期:
Activity生命周期中各个状态切换:
- 启动Activity到运行状态:onCreate() -> onStart() -> onResume() -> 界面完全显示
- 运行状态到暂停状态:界面完全显示 -> onPause() -> 界面被部分遮盖
- 暂停状态到运行状态:界面被部分遮盖 -> onResume() -> 界面完全显示
- 运行状态到停止状态:界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖
- 停止状态到运行状态:界面完全遮盖 -> onRestart() -> onStart() -> onResume() -> 界面完全显示
- 退出Activity:界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖 -> onDestroy() -> Activity结束生命周期
注:当系统内存紧张时,系统可以将Activity释放掉以获取资源,优先释放停止状态的Activity,次之则是暂时状态的Activity,而运行状态的Acitivity一般不可能被强行释放,当Activity被释放时,直接转入消亡,需要注意一点的是onDestroy()并不会被执行,所以把数据保存放在onDestroy处理是不适当的,可以在onSaveInstanceState()中对重要数据进行相应的处理。
b.Activity栈
每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态。如下图所示:
2.Activity的使用
a.创建Activity
要创建一个Activity,需要创建一个以AppCompatActivity(API22)为基类的Activity类:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
然后在res/layout创建一个activity_main.xml文件,该文件用户界面组件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.androidtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/HelloWorld"
android:text="Hello World!" />
</RelativeLayout>
最后在AndroidManifest.xml中声明该活动:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidtest">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
注:Android Studio创建Activity详见Android学习笔记之Android Studio添加新的Activity。