Intent 数据传递

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Intent 数据传递相关的知识,希望对你有一定的参考价值。

参考技术A

Activity 组件启动,Intent 类携带目标组件类信息,组件间传递的数据。

复杂类型必须实现 Parcelable 或 Serializable 接口。

Intent 类,继承 Parcelable,支持序列化,适合进程间通信。

Intent 内部数据,包括 mAction mData mPackage 等系统数据及 Bundle mExtras 自定义数据。

向 Intent 写入 自定义数据。
Intent 的 putExtra()方法,将 key-value 写入内部 Bundle mExtras,简单或复杂类型,(如 int,short,float,String,Parcelable,Serializable)

putExtras() 方法,写入 Bundle 数据

将 Bundle 参数中的存储内容合并。

Bundle 内部 ArrayMap 数据结构存储。

Bundle 继承 BaseBundle 类,putInt() 方法,是父类的方法。
Bundle 和 BaseBundle 相关方法。

ArrayMap 类存储 key-value,Bundle 的 putParcelable() 方法。

所有数据都是在 ArrayMap 数据结构存储。

Activity 组件间跳转时,Intent 数据通过 Parcel 在进程间通信。

IActivityManager 的 startActivity() 方法,向 system_service 进程 Ams 服务发送请求。

Parcel 写入数据,系统参数 resolvedType ,callingPackage 等,(String、int、Binder类型)
根据不同类型,Parcel 类的 writeXxx() 相关方法。

Intent writeToParcel() 方法,内部数据写入。

将 Intent 内部 mAction,mFlags ,Bundle mExtras 数据 写入 Parcel 。
对于 Bundle mExtras 数据。Parcel 类 writeBundle() 方法。

Bundle writeToParcel() 方法。

将 ArrayMap 每项数据,包括 key 和 value。writeValue() 方法,根据 Object,类型,选择不同的写入方法,
关于 Bundle 中复杂 Parcelable 数据类型,写入 Parcel
参考 android Parcelable

在 onCreate() 方法启动时,getIntent() 获取的 Intent 初始化时机。

Ams 服务进程通过 ApplicationThreadProxy 代理回调 App 进程时,App进程将调用ApplicationThreadNative的onTransact方法,它继承Binder。

Binder的#execTransact方法,创建两个Parcel对象,在参数data中,已经保存了Ams进程传递的数据。

Intent 实现 Parcelable 接口,通过内部 CREATOR,创建一个新 Intent 对象。

因此,在Ams进程回调App,App启动组件生命周期前已经创建Intent,在ApplicationThread的#scheduleLaunchActivity方法,传给App主线程。

Intent 构造方法

提取 Parcel 中的 Intent 字段。

根据不同类型,Parcel 类 readXxx() 方法,解析数据向新 Intent 赋值。
Parcel readBundle()方法,解析 Intent Bundle mExtras 数据。
参考 Parcel 解析 Bundle 数据

Intent 构建完毕。

Activity 组件启动,在 onCreate() 方法,Intent 类 getXxx() 方法,获取自定义数据。

从 Intent 内部 Bundle 获取数据。
Intent 类 getParcelableExtra()方法,获取 XxxBean 实例。

Bundle getParcelable() 方法,从 ArrayMap 读取。

从 ArrayMap 读取前,先调用一次 unparcel() 方法,
将 Bundle 内 Parcel 数据初始化到 ArrayMap ,否则 ArrayMap 数据是空的。

参考 Parcel 解析 Bundle 数据

任重而道远

以上是关于Intent 数据传递的主要内容,如果未能解决你的问题,请参考以下文章

android 中如何使用intent通过传递变量传递数据

Intent之复杂数据的传递

Android-Intent意图传递数据

android Intent传递数据时,哪些类型的数据可以被传递。

Intent向下一个活动传递数据

android intent 可以传递enum 吗