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. Centos7.2/7.3集群安装Kubernetes 1.8.4 + Dashboard(转)

    原文https://www.cnblogs.com/burningTheStar/p/7865998.html 1.环境配置 结点数量:3 结点系统:CentOS 7.2 / 7.3 2.效果展示 3 ...

  2. Scrapy学习篇(八)之settings

    Scrapy设定(settings)提供了定制Scrapy组件的方法.你可以控制包括核心(core),插件(extension),pipeline及spider组件.设定为代码提供了提取以key-va ...

  3. golang中defer的理解

    在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用.因此,defer通常用来释放函数内 ...

  4. host文件的工作原理及应用

    host文件的工作原理及应用 Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制. 一.Hosts文件基本介绍 ...

  5. [UE4]迁移小地图到其他工程

    一.创建一个新工程,类型不限,本次测试场创建的是赛车类工程. 二.为了方便管理,最好在All文件文件夹下新建一个名为MiniMap的目录,并把所有小地图相关的都放进来. 三.在小地图工程中,右键Rou ...

  6. Android 设置SeekBar不可拖动

    public class MyProgressBar extends SeekBar { /** * 是否支持拖动进度 */ private boolean touch = true; public ...

  7. POJ 多项式加法

    题解: 采用顺序表.考虑到题目中没有规定指数上界,为避免RE,拟不采用数组.参考了http://blog.csdn.net/inlovecy/article/details/15208473后,最终采 ...

  8. ZooKeeper系列(6):ZooKeeper机制架构

    一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control List) ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制.ACL的 ...

  9. PHP微信公众号开发之基本配置

    (提示:需要有服务器或云虚拟机) 一开始不明白公众号不是可以这样管理吗?                那么为什么用开发平台进行公众号开发,官方文档是这样说的 为了识别用户,每个用户针对每个公众号会产 ...

  10. MySql 索引 查询 优化

    官方文档: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_rows type: 连接类型 system 表只有 ...