生命周期: 从出生到死亡

Activity生命周期的7个方法和3个循环

onCreate() 创建时调用
onRestart() 不可见到可见时调用
onStart() 用户可见时调用
onResume() 用户可交互时调用
onPause() 用户不可交互时调用
onStop() 用户不可见时调用
onDestroy() 销毁时调用

启动与退出的循环
Activity启动 onCreate() -- onStart() -- onResume()
Activity退出 onPause() -- onStop() -- onDestroy()

可见与不可见的循环
Activity不可见 onPause() -- onStop()
Activity重新可见 onRestart() -- onStart() -- onResume()

焦点失去与获得的循环
Activity失去焦点 onPause()
Activity获得焦点 onResume()

-----------------------------------------
Intent 在组件之间跳转的桥梁

intent分为如下两类:
明确的intent (显式的Intent)
明确指定要跳转的Activity
不明确的intent (隐式的Intent)
没有直接指定要跳转哪个Activity 通过一系列过滤条件筛选要跳转的Activity

1.1 明确intent跳转到相同包下的Activity
intent.setClass()

1.2 明确 intent跳转到不同包下的Activity
intent.setClassName("应用程序的包名", "Activity的包名.Activity类名");
特殊情况是:Activity的包名和应用程序的包名相同,则第二个参数可以简写为".Activity类名"

1.3 明确intent跳转到不同应用下的Activity
intent.setClassName("应用程序的包名", "Activity的包名.Activity类名");
同时,被跳转的Activity需要添加action=MAIN的过滤器

不明确的intent
需要设置的过滤条件有7个:
ComponentName --- 组件名称 用法基本上和setClassName()大同小异
Action -- 动作
Category -- 额外的动作
Data -- 数据(格式为Uri对象)
Extra -- 额外的数据
Flag -- 标识
Type -- 数据的类型(MIME) 多媒体格式的数据类型(文本、图片、音频、视频)

2.1 不明确的intent跳转到相同包下的Activity
跳转的Activity需要设置
intent.setAction("com.second");
同时被跳转的Activity需要在AndroidManifest.xml中设置intent过滤器:
<intent-filter >
<action android:name="com.second"/> --- 与跳转时set一致Action()的参数
<category android:name="android.intent.category.DEFAULT"/> -- 不能省略
</intent-filter>
2.2 不明确的intent跳转到不同包下的Activity 方法同上
2.3 不明确的intent跳转到不同应用下的Activiy 方法同上

当SecondActivity需要回传参数时:
1. MainActivity启动SecondActivity时需要调用startActivityForResult()
并定义请求码
2. SecondActivity在合适的使用调用setResult()设置返回码和返回的参数
然后调用finish()结束当前Activity
3. MainActivity需要重写onActivityResult()捕获SecondActivity返回的结果

常用的返回码为:
RESULT_OK 成功
RESULT_CANCEL 失败
RESULT_FIRST_USER 用户自定义的返回码
RESULT_FIRST_USER + 1
RESULT_FIRST_USER + 2
……

Activity间传递参数的方法

方法1. 通过putExtra()传递基本数据类型

方法2. 通过putExtras()传递Bundle数据类型
方法3. 通过Application读写全局变量

方法4. 把基本的数据类型封装到一个对象中,然后通过intent传递该对象
需要考虑对Person对象进行序列化

Java中的序列化使用Serializable
Android中的序列化使用Parcelable

Serializable方式:

这是一种最简单的方式,我们需要做的仅仅是对可序列化的类,实现Serializable方法即可。

public class Person implements Serializable{
private String mName;
private String mAddress; public String getName() {
return mName;
} public void setName(String name) {
mName = name;
} public String getAddress() {
return mAddress;
} public void setAddress(String address) {
mAddress = address;
}
}

这个时候,就已经可以使用Intent 的putExtra() 方法传递这个自定义对象了,在Activity中这样使用。

Person person = new Person();
person.setName("Hwaphon");
person.setAddress("Anhui"); Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",person);
startActivity(intent);
finish();

接受数据。

Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");

可以看到 使用Serializable方法非常简单,但是Serializable会把整个对象序列化,开销非常大,为了追求效率,就不得不使用Parcelable方法了。

Parcelable方式:

用法如下:
1. 需要对可序列化的类,实现Parcelable接口
2. 实现Parcelable接口中的抽象方法
   describeContents() 该方法直接返回0

  writeToParcel(Parcel out, int flags) 把需要序列化的参数写入out中 比如:

3.除了这两个方法以外,我们还需要创建一个 Parcelable.Creator接口的实现,这个接口中也需要我们实现两个方法

  createFromParcel(Parcel in) 用于将写入Parcel容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。对in进行反序列化(需要通过Person的构造器实现)

  newArray(Parcel in) :创建一个长度为 size 的数组并且返回,一般而言,直接返回return T[size] 即可。反序列化多个元素时使用。

public class Person implements Parcelable{
private String mName;
private String mAddress; public String getName() {
return mName;
} public void setName(String name) {
mName = name;
} public String getAddress() {
return mAddress;
} public void setAddress(String address) {
mAddress = address;
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mName);
parcel.writeString(mAddress);
} public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
@Override
public Person createFromParcel(Parcel parcel) {
Person person = new Person();
person.mName = parcel.readString();
person.mAddess = parcel.readString();
return person;
} @Override
public Person[] newArray(int i) {
return new Person[i];
}
};
}

这个时候的接收方法与Serializable有点不同,如下

Intent intent = getIntent();
Person person = (Person) intent.getParcelableExtra("person");

writeToParcel()方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是Parcelabel 方法比 Serializable方法高效的原因所在。但是,这种方法比Serializable 方法多了太多的实现代码了,有没有什么办法能改变这一现状呢?可以使用插件一键生成这些代码,比如说 Android Parcelable code generator 插件,可以直接在Android Studio Plugins去下载该插件,下载完之后 点击 Alt+Insert就可以看到Parcelable选项了。

Intent传递对象、List对象:

前提:对象实现Parcelable接口

Activity A :

 intent = new Intent(v.getContext(),NoticeDetailsActivity.class);

//传递对象

bundle.putParcelable("notice", notice);
//传递list,此次只能传ArrayList
intent.putParcelableArrayListExtra("noticeList", (ArrayList<? extends Parcelable>) noticeList);
v.getContext().startActivity(intent);

Activity B:

Notice notice = intent.getParcelableExtra("notice");

List<Notice> noticeList = intent.getParcelableArrayListExtra("noticeList");

参考至:https://www.jb51.net/article/93762.htm

Activity生命周期,Activity传值(Intent)的更多相关文章

  1. android学习笔记28——Activity生命周期

    Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...

  2. Android开发——Activity生命周期

    Android开发--Activity生命周期 Activity作为四大组件之首,也是使用最频繁的一种组件.本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期和异常情况下 ...

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

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

  4. Activity生命周期(深入理解)

    今天看到一篇大神总结Activity的文章,内容甚为详细,特此转载http://www.cnblogs.com/lwbqqyumidi/p/3769113.html Android官方文档和其他不少资 ...

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

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

  6. android开发------Activity生命周期

    这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...

  7. Android总结篇系列:Activity生命周期

    Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity生命周期进行一次总结. Activity是由Activit ...

  8. Android学习整理之Activity生命周期篇

    一.Activity生命周期说明   Activity的四种状态: ⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能 ...

  9. 基础总结篇之一:Activity生命周期

    子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...

随机推荐

  1. spring boot 项目文件结构

    启动类建议放在RootPackage的原因: 根据SpringBoot的内置实现,Spring默认从@ComponentScan注解所在的位置开始向后扫描,也就是说,只要我们将组件放在启动类所在的Ro ...

  2. Windows下 YOLOv3配置教程(YOLOv3项VS2013平台迁移的方法)

    https://blog.csdn.net/maweifei/article/details/81150489

  3. CSS Grid布局入门

    相信大家都比较熟悉flex布局了,最近有空研究了波grid布局,感觉虽然兼容性还不是太高,应用不是太普遍,但是功能非常强大.未来应该是grid+flex为主流,grid是二维布局,很灵活,适合整体构架 ...

  4. Hadoop高级培训课程大纲-开发者版

    一.课程概述 本次培训课程主要面向大数据系统管理人员和开发设计人员,基于开源社区大数据应用最活跃的Hadoop和HBase技术框架,围绕分布式文件存储(HDFS).分布式并行计算(Map/Recue) ...

  5. 浏览器缩放导致的样式bug

    缩放75% 这种问题修改的话 要兼顾多种浏览器,并且有些地方样式是要求写死的,修改成本会比较大,所以一般是不会去处理的

  6. VBA 对比两行数据

    Sub DB_Row() Dim i, j As Integer Dim row1, row2 As Integer row1 = ' 对比第 3 行 row2 = ' 和第 4 行 For i = ...

  7. 关于DELL服务器如果采购散件,进行服务器升级的相关说明

    拿DELL服务器内存来说明这个情况,其他硬盘等等是 一样的: 1.DELL服务器的内存散件,从购买之日起,质保期是一年: 2.但是如果你把内存插到能兼容这个内存的服务器上去使用,请注意我的字眼,是能兼 ...

  8. Web安全测试指南--会话管理

    会话复杂度: 5.3.2.会话预测: 5.3.3.会话定置: 5.3.4.CSRF: 5.3.5.会话注销: 5.3.6.会话超时:

  9. [UE4]用向量表示方向

    向量的概念 一.物理角度的向量 1)向量就是具有大小和长度的量 2)向量就是空间空的箭头 3)向量可以随意平移 举例:力,force:速度,velcity.这些都是具有大小和方向的量,都可以看成是向量 ...

  10. CentOS 6.2图形界面允许root用户登录

    测试环境中,很多操作需要root用户权限,为了提高测试效率,因此有时希望直接使用root用户登陆系统,但是CentOS的图形界面默认不允许root用户登陆,这是由于pam的限制,需要进行如下设定: 1 ...