Intent 数据传递
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Intent 数据传递相关的知识,希望对你有一定的参考价值。
参考技术AActivity 组件启动,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 数据传递的主要内容,如果未能解决你的问题,请参考以下文章