本篇随笔将会深入学习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进行注册

       

这样,我们在启动了我们的应用程序后,就会默认加载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的生命周期函数调用时机后,就可以灵活的在对应的方法中来完成我们需要完成的功能了。

转载于:https://blog.51cto.com/3237526/1606360

Android 组件系列-----Activity生命周期相关推荐

  1. Android面试之Activity生命周期详解

    Activity生命周期详解 一 Activity的四种状态: Activity的生命周期中存在四种基本的状态:活动状态(Active/Runing),暂停状态(Paused),停止状态(Stoppe ...

  2. Android Ams对于Activity生命周期的管理

    分析Activity的生命周期管理,我觉得应该先看下面两篇关于Activity的官方文档: 了解 Activity 生命周期 处理 Activity 状态更改 里面有下面一段话,比较简洁的说出了Act ...

  3. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  4. 四大组件之activity生命周期探索

    在android开发中,activity可以说是我们见过的最多的组件了,我们平常app的界面都是通过activity来展现在我们面前的,可以包含多种用户界面的组件,主要用于和用户进行交互.一个应用程序 ...

  5. android组件化数据生命周期,Android组件化开发实践(五):组件生命周期管理

    每个Android应用启动时,都会先创建一个Application.通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化.在应用组件化之后,组件与壳工程是隔离开来的, ...

  6. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  7. Android组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  8. Android 组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  9. Android 组件系列-----Activity初步

    在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...

最新文章

  1. 转载 - sql分页优化
  2. C#并发实战Parallel.ForEach使用
  3. Restful HMAC认证
  4. Vuex原来可以这样上手
  5. How to stop looking for someone perfect and find someone to love
  6. 使用 sublime数组转换成逗号分割文本
  7. 数据库和SQL基本知识点
  8. ZOOM视频会议共享声音,Zoom共享屏幕播放视频卡顿,你学会了吗?
  9. 传感器技术-电容式传感器(学习笔记六)
  10. Linux下确认CPU是否开启超线程
  11. DLP和DMD的区别
  12. 《SysML精粹》学习记录--第八章
  13. 到底什么是工业互联网?
  14. 关于线上支付的实现思想方法与例子
  15. vuex入门到实战——实现一个todoList待办清单【学习记录】
  16. Win7 各种语言包下载
  17. csdn的粉丝老铁及技术小伙伴们拜年
  18. 利用内网穿透实现无固定IP调试支付回调
  19. 视频编解码(h.264)的一些资源
  20. ubuntu12.04的ATI驱动的安装

热门文章

  1. 【体系结构】Oracle实例崩溃恢复原理
  2. linux之chroot命令
  3. TemplateSyntaxError: 'crispy_forms_tags' is not a registered tag library.报错的解决办法
  4. android studio中如何替换gradle以防下载卡住
  5. C# 合并多个不同格式文档为一个PDF
  6. java 之 单例模式(大话设计模式)
  7. 烂泥:CentOS命令学习之scp复制
  8. chrome浏览器安装网页测试插件postman的图文步骤记录
  9. 匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范
  10. 23.使用非阻塞IO 2