博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Intent序列化
阅读量:6827 次
发布时间:2019-06-26

本文共 5382 字,大约阅读时间需要 17 分钟。

在使用debug看获取到的Intent内容时,显示的是如下内容:

Intent { act=android.intent.action.VIEW dat=#Intent;action=com.ting.testAction;S.package_name=com.ting.testPackage;S.method_name=testMethod;S.params={"intent":"

flg=0x10020000 pkg=com.ting.test cmp=com.ting.test/.CodeTestActivity (has extras) }

注意:红色字体显示的是Intent的data的内容,因为是用的debug,没有显示全。

如此显示,是使用了Intent的toString方法。下面让我们一点一点跟进。

@Override    public String toString() {        StringBuilder b = new StringBuilder(128);        b.append("Intent { ");        toShortString(b, true, true, true, false);        b.append(" }");        return b.toString();    }

Intent的toString方法中使用了toShortString,跟进。

/** @hide */    public void toShortString(StringBuilder b, boolean secure, boolean comp, boolean extras,            boolean clip) {        boolean first = true;        if (mAction != null) {            b.append("act=").append(mAction);            first = false;        }        if (mCategories != null) {            if (!first) {                b.append(' ');            }            first = false;            b.append("cat=[");            for (int i=0; i
0) b.append(','); b.append(mCategories.valueAt(i)); } b.append("]"); } if (mData != null) { if (!first) { b.append(' '); } first = false; b.append("dat="); if (secure) { b.append(mData.toSafeString()); } else { b.append(mData); } } if (mType != null) { if (!first) { b.append(' '); } first = false; b.append("typ=").append(mType); } if (mFlags != 0) { if (!first) { b.append(' '); } first = false; b.append("flg=0x").append(Integer.toHexString(mFlags)); } if (mPackage != null) { if (!first) { b.append(' '); } first = false; b.append("pkg=").append(mPackage); } if (comp && mComponent != null) { if (!first) { b.append(' '); } first = false; b.append("cmp=").append(mComponent.flattenToShortString()); } if (mSourceBounds != null) { if (!first) { b.append(' '); } first = false; b.append("bnds=").append(mSourceBounds.toShortString()); } if (mClipData != null) { if (!first) { b.append(' '); } b.append("clip={"); if (clip) { mClipData.toShortString(b); } else { if (mClipData.getDescription() != null) { first = !mClipData.getDescription().toShortStringTypesOnly(b); } else { first = true; } mClipData.toShortStringShortItems(b, first); } first = false; b.append('}'); } if (extras && mExtras != null) { if (!first) { b.append(' '); } first = false; b.append("(has extras)"); } if (mContentUserHint != UserHandle.USER_CURRENT) { if (!first) { b.append(' '); } first = false; b.append("u=").append(mContentUserHint); } if (mSelector != null) { b.append(" sel="); mSelector.toShortString(b, secure, comp, extras, clip); b.append("}"); } }

下面我看下红色的dat=内容。

Intent { act=android.intent.action.VIEW dat=#Intent;action=com.ting.testAction;S.package_name=com.ting.testPackage;S.method_name=testMethod;S.params={"intent":"

flg=0x10020000 pkg=com.ting.test cmp=com.ting.test/.CodeTestActivity (has extras) }

它其实是把一个Intent转成Uri,传到data中。下面我们来看一下Intent序列化转成Uri的代码。

public String toUri(int flags) {        ......//此处省略        toUriFragment(uri, scheme, Intent.ACTION_VIEW, null, flags);        return uri.toString();    }

Intent的toUri方法中调用到了toUriFragment方法,跟进。

private void toUriFragment(StringBuilder uri, String scheme, String defAction,            String defPackage, int flags) {        StringBuilder frag = new StringBuilder(128);        toUriInner(frag, scheme, defAction, defPackage, flags);        if (mSelector != null) {            frag.append("SEL;");            // Note that for now we are not going to try to handle the            // data part; not clear how to represent this as a URI, and            // not much utility in it.            mSelector.toUriInner(frag, mSelector.mData != null ? mSelector.mData.getScheme() : null,                    null, null, flags);        }        if (frag.length() > 0) {            uri.append("#Intent;");            uri.append(frag);            uri.append("end");        }    }

里面用到了toUriInner方法,跟进。

private void toUriInner(StringBuilder uri, String scheme, String defAction,            String defPackage, int flags) {        if (scheme != null) {            uri.append("scheme=").append(scheme).append(';');        }        if (mAction != null && !mAction.equals(defAction)) {            uri.append("action=").append(Uri.encode(mAction)).append(';');        }        if (mCategories != null) {            for (int i=0; i

终于看到全貌了。

转载于:https://my.oschina.net/tingzi/blog/833218

你可能感兴趣的文章
引水数据--紧凑
查看>>
yum安装ftp服务器
查看>>
滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月22日~8月28日)...
查看>>
PHP中一些有用的函数
查看>>
[Logstash]使用详解
查看>>
Android USER 版本与ENG 版本的差异
查看>>
命令行设置IE代理
查看>>
面试中二叉树总结
查看>>
翻译器DIY————次序
查看>>
easyui form 提交问题,纠结了很久,有点诡异
查看>>
Swift - 图像控件(UIImageView)的用法
查看>>
Cloneable接口和Object的clone()方法
查看>>
[saiku] 连接 mondrain 数据源出错-空指针错误
查看>>
【转发】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。...
查看>>
ORACLE和SQL SERVER的数据同步常用方法
查看>>
easyui 入门
查看>>
KMP算法之从next[]到nextVal[] (转)
查看>>
JAVA操作properties文件
查看>>
GoldenGate中使用FILTER,COMPUTE 和SQLEXEC命令
查看>>
自执行函数的一些总结
查看>>