本篇随笔将会深入学习Activity,包括如何定义多个Activity,并设置为默认的Activity、如何从一个Activity跳转到另一个Activity,还有就是详细分析Activity的生命周期函数。

一、如何定义多个Activity

在我们之前写的程序当中,我们都是用的MainActivity这个由ADT自动生成的Activity,但是我们一个程序可能有多个Activity,那么我们应该如何定义多个Activity呢?步骤如下:

1.定义一个类让其继承Activity这个父类

2.重写父类的onCreate()方法

3.在AndroidManifest.xml文件中注册这个Activity

首先我们再写一个布局文件second.xml

<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: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=".MainActivity" > <TextView
android:id="@+id/firstTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="FirstActivity" /> <Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_below="@id/firstTextView"
android:text="SecondActivity"/> </RelativeLayout>

接着写一个类SecondActivity,继承Activity这个类,并重写onCreate()方法

package com.xiaoluo.android_multiactivity;

import android.app.Activity;
import android.os.Bundle; public class SecondActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
}

最后在我们的AndroidManifest.xml文件中对这个Activity进行注册

    <activity
android:name="com.xiaoluo.android_multiactivity.SecondActivity"
android:label="SecondActivity">
       <!--如果加上了下面这个子元素,则表示该Activity是这个应用程序默认启动的Activity-->
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

这样,我们在启动了我们的应用程序后,就会默认加载SeoncdActivity,然后加载我们的布局文件

二、如何从一个Activity跳转到另一个Activity

我们在知道如何定义多个Activity后,接下来要了解的就是如何从一个Activity跳转到另一个Activity上,就像我们web程序一样,首先进入一个主页,然后再通过按钮或者链接跳转到另外的页面上。我们先来看看两个布局文件

activity_main.xml

<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: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=".MainActivity" > <TextView
android:id="@+id/firstTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="FirstActivity" /> <Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_below="@id/firstTextView"
android:text="SecondActivity"/> </RelativeLayout>

second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/secondTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="第二个Activity"/> </LinearLayout>

我们希望通过点击第一个Activity的Button按钮跳转到第二个Activity上

我们来看看MainActivity这个类该怎样写:

package com.xiaoluo.android_multiactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity
{
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button);
ButtonListener buttonListener = new ButtonListener();
button.setOnClickListener(buttonListener);
} class ButtonListener implements OnClickListener
{
@Override
public void onClick(View v)
{
// 在android中,要做各种事,例如启动一个Activity,都需要生成一个Intent(意图)对象
Intent intent = new Intent();
/*
* Context是一个类,所有的Activity都是Context的一个子类,所以
* setClass方法的第一个参数接收的是一个Context类型对象,我们将当前这个Activity对象传进去就可
* 第二个参数就是我们需要启动的Activity的class对象
*/
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

启动另一个Activity最重要的方法就是首先创建一个Intent对象,在Android中,我们几乎要做的任何事,都是要通过Intent(意图)对象来做的,然后通过setClass方法来设置我们要跳转的Activity的类,最后调用startActivity方法来跳转到我们的Activity上。

这样当我们点击了第一个Activity的Button按钮后,就会跳转到第二个Activity上。

三、Back Stack

这一节我们来稍微探讨一下Android当中的Back Stack这个东西,back stack可称为后退栈,里面存放的是我们的Activity对象,我们知道栈是一种后进先出的数据结构,当我们的应用程序启动时,Android会自动创建我们默认的一个Activity对象,将其放在栈底,当我们从这个Activity跳转到另一个Activity对象上时,此时就会生成第二个Activity的一个对象,然后将其放在back stack中,这样第二个Activity对象就位于栈顶了,要记住:Android应用程序显示的永远都是栈顶的Activity。当来第三个Activity对象时,同样将其放入back stack当中,此时第三个Activity就成为了栈顶对象,这样我们看到的就是第三个Activity对象对应的布局文件,如果此时我们点击返回按钮,此时根据栈的"后进先出"原则,首先将栈顶的第三个Activity对象从back stack中弹出去,这时位于栈顶的就是第二个Activity对象,此时界面就是这个Activity对象的布局文件,再点击返回,又将第二个Activity对象弹出去,此时就会显示第一个Activity对象的布局文件,这就是为什么我们点击返回后会跳到上层页面的原因所在!

四、Activity的生命周期

最后一节,将来详细探讨一下Activity的生命周期,我们要了解在Activity对象从创建到最后被销毁中间经历了哪些阶段,每个阶段我们又能让其为我们做什么?

Activity的生命周期分为7段,每个阶段都有一个对应的生命周期函数,我们首先来看一张图,来看看这七个生命周期函数所执行的时间

我们下面来通过一个例子来详细的探讨这7个生命周期函数调用的时机,同样是从一个Activity调到另一个Activity,然后我们在每个函数里打印出对应的信息,来看看生命周期函数调用的时机:

首先来看看两个布局文件,很简单

<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: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=".MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/textView1"
android:text="跳转到SecondActivity"/> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SecondActivity"/> </LinearLayout>

接着来看看我们的两个Activity类:

MainActivity:

public class MainActivity extends Activity
{
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button);
ButtonListener buttonListener = new ButtonListener();
button.setOnClickListener(buttonListener); System.out.println("MainActivity: onCreate");
} class ButtonListener implements OnClickListener
{
@Override
public void onClick(View v)
{
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
} @Override
protected void onStart()
{
super.onStart();
System.out.println("MainActivity: onStart");
} @Override
protected void onResume()
{
super.onResume();
System.out.println("MainActivity: onResume");
} @Override
protected void onPause()
{
super.onPause();
System.out.println("MainActivity: onPause");
} @Override
protected void onStop()
{
super.onStop();
System.out.println("MainActivity: onStop");
} @Override
protected void onRestart()
{
super.onRestart();
System.out.println("MainActivity: onRestart");
} @Override
protected void onDestroy()
{
super.onDestroy();
System.out.println("MainActivity: onDestroy");
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

SecondActivity类:

public class SecondActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
System.out.println("SecondActivity: onCreate");
} @Override
protected void onStart()
{
super.onStart();
System.out.println("SecondActivity: onStart");
} @Override
protected void onResume()
{
super.onResume();
System.out.println("SecondActivity: onResume");
} @Override
protected void onPause()
{
super.onPause();
System.out.println("SecondActivity: onPause");
} @Override
protected void onStop()
{
super.onStop();
System.out.println("SecondActivity: onStop");
} @Override
protected void onRestart()
{
super.onRestart();
System.out.println("SecondActivity: onRestart");
} @Override
protected void onDestroy()
{
super.onDestroy();
System.out.println("SecondActivity: onDestroy");
}
}

最后,要记住,在AndroidManifest.xml文件中对Activity进行注册,并设置一个默认启动的Activity,我们这里就是MainActivity:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaoluo.android_lifecycle"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.xiaoluo.android_lifecycle.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> <activity
android:name="com.xiaoluo.android_lifecycle.SecondActivity"
android:label="SecondActivity">
</activity>
</application> </manifest>

下面我们启动我们的程序,然后点击第一个Activity的Button按钮跳转到第二个Activity上,再点击返回按钮返回到第一个Activity上,我们来看看控制台的输出,并解析其为什么会打印出这样的语句,也就是为什么会在这个时候调用该周期函数:

首先会打印出这三条语句,因为我们默认启动的是MainActivity对象,所以此时当Activity对象一启动并显示出能与用户交互的界面时会分别调用 onCreate、onStart和onResume方法,此时我们点击Button按钮跳转到第二个Activity上:

此时,根据上面我们的那张表格知道,当一个Activity准备跳转到另一个Activity上时,当前这个Activity对象会调用onPause方法,此时跳转到第二个Activity上时,会因此调用第二个Activity对象的onCreate、onStart和onResume方法,最后,因为第二个Activity的界面完全覆盖了第一个Activity,所以此时会调用第一个Activity对象的 onStop 方法

这时我们点击返回来回到第一个Activity页面上:

我们看到,因为此时也是从一个Activity跳转到另一个Activity,所以此时会调用第二个Activity对象的onPause方法,那么为什么此时会接着调用我们第一个Activity对象的onRestart方法呢?这时就要回顾下我们第三节的那个 back stack 知识点了,我们知道,当创建一个Activity对象后,会将其因此放入back stack栈中,Android显示的总是栈顶的Activity对象,因为当前默认启动的是MainActivity对象,所以MainActivity对象是放在最下面,SecondActivity对象放在栈顶上,当我们点击返回时,会将SecondActivity对象从栈中弹出去,所以此时因为MainActivity对象是存在于stack栈中的,所以此时会调用其 onRestart 方法,而不是onCreate方法,紧接着就是调用 onStart、onResume方法,最后第一个Activity覆盖了第二个Activity,所以分别又会调用SecondActivity对象的 onStop和 onDestroy方法,将SecondActivity对象销毁。

这就是我们整个的Activity对象的生命周期函数的调用含义,我们来看看Android官方提供的Activity生命周期图:

相信结合上述例子以及android官方提供的Activity生命周期图,大家应该会对Activity对象的生命周期了如指掌了吧。

五、Activity对象的三种状态

最后我们再来了解一个知识点--Activity对象的三种状态:

①Resumed状态:此时我们的Activity处于活动状态,可以与用户进行交互。

②Paused状态:此时我们启动了第二个Activity,但是第一个Activity对象并没有消失掉,例如弹出式的对话框,此时就属于Paused状态。

③Stopped状态:此时第二个Activity完全覆盖了第一个Activity,这时第一个Activity对象就处于Stopped状态。

总结:本篇随笔讲解了如何定义多个Activity,并学习了如何从一个Activity跳转到另外的Activity上,最后还详细讲解了Activity的生命周期,我们在了解了Activity的生命周期函数调用时机后,就可以灵活的在对应的方法中来完成我们需要完成的功能了。

Android 组件系列-----Activity生命周期的更多相关文章

  1. Android-管理Activity生命周期 -停止和重启Activity

    停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...

  2. Android-管理Activity生命周期 -暂停和恢复一个Activity

    在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...

  3. Android-管理Activity生命周期 -重新创建Activity

    按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...

  4. Android-管理Activity生命周期 -开始一个Activity

    很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...

  5. 【Android实验】第一个Android程序与Activity生命周期

    目录 第一个Android程序和Activity生命周期 实验目的 实验要求 实验过程 1. 程序正常启动与关闭 2. 外来电话接入的情况 3. 外来短信接入的情况 4. 程序运行中切换到其他程序(比 ...

  6. Android 四大组件之Activity生命周期

    写这篇博文之前,已经对android有一定的了解和认识.这篇博文主要讲述android的Activity的生命周期,这是android开发者必须掌握的知识.android的Activity组件拥有7个 ...

  7. 深入剖析Android四大组件(一)——Activity生命周期具体解释

    1.管理Activity的生命周期 不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的 ...

  8. Android体系结构及activity生命周期

    Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核 Android的系统架构图    每层 ...

  9. 四大组件之Activity——生命周期

    1.完整的Activity生命周期 包括onCreate() -> onStart() -> onResume() -> onPause() -> onStop -> o ...

随机推荐

  1. Swagger 常用注解

    一.Swagger常用注解 1.与模型相关的注解 两个注解: @ApiModel:用在模型类上,对模型类做注释: @ApiModelProperty:用在属性上,对属性做注释 2.与接口相关的注解 六 ...

  2. BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1143 题意概括 给出一个有向图.求最小链覆盖. 题解 首先说两个概念: 链:一条链是一些点的集合, ...

  3. pandas.cut使用总结

    用途 pandas.cut用来把一组数据分割成离散的区间.比如有一组年龄数据,可以使用pandas.cut将年龄数据分割成不同的年龄段并打上标签. 原型 pandas.cut(x, bins, rig ...

  4. Windows10下安装Maven以及Eclipse安装Maven插件 + 创建Maven项目

    在官网下载Maven      http://maven.apache.org/download.cgi 下载下来后加压缩,将apache-maven-3.5.4文件夹复制到想要存放它的位置,我放在了 ...

  5. QT学习之windows下安装配置PyQt5

    windows下安装配置PyQt5 目录 为什么要学习QT 命令行安装PyQt5以及PyQt5-tools 配置QtDesigner.PyUIC及PyRcc 为什么要学习QT python下与界面开发 ...

  6. go标准库-log包源码学习

    log包是go语言提供的一个简单的日志记录功能,其中定义了一个结构体类型 Logger,是整个包的基础部分,包中的其他方法都是围绕这整个结构体创建的. Logger结构 Logger结构的定义如下: ...

  7. R1题解

    估分 大佬们都去写题解了,我不写可能会被老师训诶.... 预计分数:100 + 100 + 5 + 100 + 25 + 100 = 430 实际 :80 + 100 + 0 + 100 + 25 + ...

  8. Codeforces Round #516 (Div. 2) (A~E)

    目录 Codeforces 1064 A.Make a triangle! B.Equations of Mathematical Magic C.Oh Those Palindromes D.Lab ...

  9. 洛谷P1823 音乐会的等待

    To 洛谷.1823 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或 ...

  10. 洛谷P1063 能量项链(区间DP)(环形DP)

    To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...