Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口。它是android应用中最重要的组成单元之一,提供了和用户交互的可视化界面。在一个Activity中,可以添加很多组件,这些组件负责具体的功能。

在android应用中,可以有多个Activity,这些Activity组成了Activity Stack,当前活动的Activity处于栈顶,之前的Activity被压在下面,成为非活动Activity,等待是否可能被恢复为活动状态。在Activity的生命周期中,有如下表所示的四个重要状态:

状态

描述

活动状态

当前的Activity,位于栈顶,用户可见,并且可以获得焦点

暂停状态

失去焦点的Activity,仍然可见,但是在内存低的情况下,不能被系统杀死

停止状态

该Activity被其他Activity所覆盖,不可见,但是它仍然保持所有的状态和信息。但内存低的情况下,它将要被系统杀死。

销毁状态

该Activity结束,或Activity所在的Dalvik进程结束

对于这是个具体的状态Activity也拥有相应的函数去实现,系统会根据这些函数,在不同的生命周期返回调用对应的方法,完成Activity的状态切换。

这些回调函数分别是:

onCreate():创建Activity时被回调。该方法是最常见的方法,一般在IDE工具中,创建Activity的话,会默认创建一个onCreate()方法,同时默认重写onCreate(Bundle saveInstanceState)方法,使得Activity能够被初始化。

onStart():启动Activity时回调,也就是但一个Activity变为显示时被回调。

onRestart():重新启动Activity时被回调,该方法总是在onStart()之后执行。

onPause():暂停Activity时被回调。该方法需要被非常快速的执行,因为直到该方法执行完毕后,下一个Activity才能恢复。在该方法中,通常用于持久保存数据。

onresume():但Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity的栈顶。该方法总是在onPause()方法以后执行。

onStop():停止Activity时被调用。

onDestory():销毁Activity时被调用。

Activity的完整周期运行模式,如下图所示:

在Activity之间切换的方法:

Current Activity 代码:

Intent i = new Intent(CurrentActivity.this,destinationActivity.class)
startActivity(i);

Activity之间参数传递:

Intent 对象也可以储存数据,在Acivity之间切换时,完成数据传递

Current Activity 代码:

Intent i = new Intent();

i.putExtra("data","fog meassage!");//i.putExtra(String dataName,String data);

Destination Activity 代码:

Inten i = getIntent();
TextView.setText(i.getString("data")); //TextView.setText("dataName");

Activity之间的Bundle(包)传递:

Current Activity 代码:

Intent i = new Intent();
Bundle data = new Bundle();
data.putString("name","fog");
data.putInt("age",25);
i.putExtras(data); //putExtra()用于单值传递,putExtras()用于bundle的传递

Destination Activity 代码:

Inten i = getIntent();
Bundle data = i.getExtras();
txShow.setText(String.format("name=%s,age=%d,name1=%s",data.getString("name"),data.getInt("age"),
data.getString("name1","null.fog")));
//name1 没有得到相应的值则默认为“null.fog”

//String.format()为字符串的格式化输出

Activity之间传递自定义class的对象方法(值对象/有数据结构的对象):

如果传递的是自定义的class对象信息,那么有两个方法可以实现,否则会出现nullpointException或Cating Exception。

方法一:实现Serializable接口(该接口属于java)

方法二:实现Parcelable接口(该接口属于Android)

//方法一:
class User implements Serializable {
属性和方法
} //方法二:
class User implements Parcelable {
属性和方法
  
@Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeInt(getAge());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
return new User(source.readString(),source.readInt());
} @Override
public User[] newArray(int size) {
return new User[size];
}
};
}
 

两种方法的比较:

方法一只需要声明一下implements Serializable即可,十分方便和简单,而方法二需要重写大量方法和数据处理过程,十分繁琐,且不易理解和使用。但方法一来自java类库,里面的数据处理完全依赖系统自己处理,从而导致效率底下,方法二来自Android的类库,而且由程序员自己设定的方法执行,对于系统的负担较小且效率相对而言更高。

Activity的参数返回:

Current Activity 代码:

i.putExtra("user",new User("fog",2));
// startActivity(i);
// 这里不能再使用startActivity()方法
 startActivityForResult(i,0);  
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); TextView.setText("另一个Activity返回的数据是" + data.getStringExtra("data")); }

Destination Activity 代码:

Intent i = new Intent();
i.putExtra("data",editText.getText().toString()); //这里是通过一个EditText控件获取的输入信息
setResult(1,i);                     //
finish();                         //此方法为结束当前Activity,方便参数在源Activity中显示

Activity的启动模式:

Activity拥有四种启动模式:

1.标准模式(standard)

2.singleTop

3.singleTask

4.SingleInstance

Activity堆栈的存在:

启动Acitivity时,从第一个实例化对象开始,再打开一个Acitivity对象就将原先的Activity压入栈内,新建的Acitivity处于栈顶,以此类推。所谓的Activity模式就是Acitivity的栈的运作方式。

标准启动模式(此模式为默认启动模式):

在一个Acitivity堆栈内,每打开一个新的Acitivity就新建一个Acitivity的实例化对象,并将其压入栈顶,每当执行一次后退操作,即杀死栈顶的Acitivity,将上一个Acitivity还原并使其处于栈顶。

注:此模式下,所有的Acitivity均处于同一个Acitivity任务栈中,并且若打开已经打开过的Acitivity对象,会创建新的实例化对象。

singleTop模式:

若一个Acitivity位于栈顶,则不能再次创建此Acitivity的实例化对象,若不位于栈顶,则会创建新的实例化对象。相比标准模式而言,就是禁止位于栈顶的Acitivity对象重复打开自己。

注:此模式下的Acitivity同样处于一个任务栈中

SingleTask模式:

若A,B按顺序启动后,Acitivity的栈的顺序为AB(从栈底到栈顶),此时位于Acitivity B,若想回到Acitivity A,则系统会回到最初创建的 A Acitivity的位置,并抛弃或杀死掉自最初A Acitivity创建至现在所有的Acitivity实例化对象,若AB顺序回到A,则B会被杀死。

注:此模式下的Acitivity同样处于一个任务栈中

和SingleInstance模式:

此模式下,一个任务栈只能存在一个Acitivity实例化对象,若开启其他Acitivity会在另一个任务栈中打开。

注:除此模式下,所有的Acitivity均处于不同的任务栈以外,其他的模式中Acitivity所有的实例化对象均处于同一个任务栈中。

Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式的更多相关文章

  1. Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity

    在正常使用应用的过程中.前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停.举个样例.当一个半透明的activity被打开(比如一个dialog样式的activity), ...

  2. Activity 生命周期及其栈管理方式

    Activity 生命周期 Android 系统用栈的形式管理 Activity , 当新的 Activity 被创建是, 会被放置到栈顶, 这个 Activity 会进入到运行状态, 而前一个 Ac ...

  3. Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解

    前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...

  4. activity之间參数传递&amp;&amp;获取activity返回值&amp;&amp;activity生命周期

    Activity之间參数传递 A activity想将參数传给B activity时能够利用Intent将消息带过去 Intent intent = new Intent(this,BActivity ...

  5. Android 面试之横竖屏切换的Activity生命周期

    public class EngineerJspActivity extends Activity { private static String Tag = "EngineerJspAct ...

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

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

  7. android Activity生命周期(设备旋转、数据恢复等)与启动模式

    1.Activity生命周期     接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...

  8. Android开发--Activity生命周期回顾理解

    Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...

  9. 异常情况下的Activity生命周期分析

    情况1:资源相关的系统配置发生改变 资源相关的系统配置发生改变,举个栗子.当前Activity处于竖屏状态的时候突然转成横屏,系统配置发生了改变,Activity就会销毁并且重建,其onPause, ...

  10. Activity生命周期的学习以及Logcat的使用

    http://android.blog.51cto.com/268543/322518/  Activities是由Activity stack管理的.当一个新的Activity被启动,它就会处于st ...

随机推荐

  1. selector的小箭头去除

    selector的小箭头去除 .not-arrow{ -webkit-appearance:none; -moz-appearance:none; appearance:none; /*去掉下拉箭头* ...

  2. [UE4]不推荐的UI更新方式

    在创建UI的时候,把UI保存到一个变量,直接访问其中的控件. 这种方法会增加耦合,不推荐,应当尽量避免使用这种方式.

  3. OpenSips使用说明

    OpenSips使用说明 安装MYSQL 安装及初始化 下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-gli ...

  4. UE4里的自定义深度功能

    转自:http://www.52vr.com/article-1866-1.html 随着物理渲染系统的发布,虚幻引擎4同时引进了一个新的深度缓存功能,它叫作“自定义深度”,可以用于诸如编辑器里的选择 ...

  5. Java 4- Java 变量类型

    Java 变量类型 在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ...

  6. 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist

    第一步:在管理员命令中输入: mysql_upgrade -u root -p --force 第二步:关闭并重启数据库 service mysql stop service mysql start

  7. 安全测试4_客户端的安全漏洞(XSS、CSRF、点击劫持、URL跳转)

    那个fanh前面学习的都是基础,现在开始正式学习下安全的知识,这一章主要讲解客户端常见的安全漏洞. 看到这个不错,给大家记一下: 1.常见的安全事件: 2.XSS(跨站脚本),英文全称:Cross S ...

  8. 零基础学习python_字符串(14-15课)

    今天回顾下我之前学习python的第一个对象——字符串,这个对象真蛋疼,因为方法是最多的,也是最常见的类型,没有之一... 内容有点多,我就搜了下网上的资料,转载下这个看起来还不错的网址吧:http: ...

  9. [oracle,2017-11-28] 怎么判断oracle数据库中字段是否为空

    要给oracle某个字段插入空值非常简单 insert into table(column) values('') 但是查询的时候通过语句 select * from table where colu ...

  10. django连接mysql数据库以及建表操作

    django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找 ...