Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式
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的启动模式的更多相关文章
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
在正常使用应用的过程中.前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停.举个样例.当一个半透明的activity被打开(比如一个dialog样式的activity), ...
- Activity 生命周期及其栈管理方式
Activity 生命周期 Android 系统用栈的形式管理 Activity , 当新的 Activity 被创建是, 会被放置到栈顶, 这个 Activity 会进入到运行状态, 而前一个 Ac ...
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- activity之间參数传递&&获取activity返回值&&activity生命周期
Activity之间參数传递 A activity想将參数传给B activity时能够利用Intent将消息带过去 Intent intent = new Intent(this,BActivity ...
- Android 面试之横竖屏切换的Activity生命周期
public class EngineerJspActivity extends Activity { private static String Tag = "EngineerJspAct ...
- 深入剖析Android四大组件(一)——Activity生命周期具体解释
1.管理Activity的生命周期 不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的 ...
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
1.Activity生命周期 接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...
- Android开发--Activity生命周期回顾理解
Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...
- 异常情况下的Activity生命周期分析
情况1:资源相关的系统配置发生改变 资源相关的系统配置发生改变,举个栗子.当前Activity处于竖屏状态的时候突然转成横屏,系统配置发生了改变,Activity就会销毁并且重建,其onPause, ...
- Activity生命周期的学习以及Logcat的使用
http://android.blog.51cto.com/268543/322518/ Activities是由Activity stack管理的.当一个新的Activity被启动,它就会处于st ...
随机推荐
- 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 ...
- Scrapy学习篇(八)之settings
Scrapy设定(settings)提供了定制Scrapy组件的方法.你可以控制包括核心(core),插件(extension),pipeline及spider组件.设定为代码提供了提取以key-va ...
- golang中defer的理解
在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用.因此,defer通常用来释放函数内 ...
- host文件的工作原理及应用
host文件的工作原理及应用 Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制. 一.Hosts文件基本介绍 ...
- [UE4]迁移小地图到其他工程
一.创建一个新工程,类型不限,本次测试场创建的是赛车类工程. 二.为了方便管理,最好在All文件文件夹下新建一个名为MiniMap的目录,并把所有小地图相关的都放进来. 三.在小地图工程中,右键Rou ...
- Android 设置SeekBar不可拖动
public class MyProgressBar extends SeekBar { /** * 是否支持拖动进度 */ private boolean touch = true; public ...
- POJ 多项式加法
题解: 采用顺序表.考虑到题目中没有规定指数上界,为避免RE,拟不采用数组.参考了http://blog.csdn.net/inlovecy/article/details/15208473后,最终采 ...
- ZooKeeper系列(6):ZooKeeper机制架构
一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control List) ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制.ACL的 ...
- PHP微信公众号开发之基本配置
(提示:需要有服务器或云虚拟机) 一开始不明白公众号不是可以这样管理吗? 那么为什么用开发平台进行公众号开发,官方文档是这样说的 为了识别用户,每个用户针对每个公众号会产 ...
- MySql 索引 查询 优化
官方文档: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_rows type: 连接类型 system 表只有 ...