1.android 为什么用intent 进行数据交互

2.android中intent的作用

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

4.intent对象有哪几个元素?各有什么作用?

5.Intent传递数据时,可以传递哪些类型数据

6.android 显示intent和隐士inent的区别

7.tense tend intent 这三个词怎么辨析?

8.Intent数据大小限制及TransactionTooLargeException异常

intent_intentional

intend

KK:[]

DJ:[]

vt.

1.想要;打算[+to-v][+v-ing][+(that)][O2]

He intends his son to manage the company.

他打算让他儿子经营该公司.

I intend studying abroad.

我打算出国留学.

I intend to study abroad.

我打算出国留学.

Let's ask her what she intends us to do.

让我们问她要我们做什么.

What do you intend to do today?

你今天打算做什么?

2.打算使...(成为);(为...而)准备[H][(+for/as)][O2]

That trap is intended for you.

那个圈套是为你而设的.

3.意指,意思是

intent

KK:[]

DJ:[]

n.[U]

1.意图,目的[+to-v]

The man was charged with intent to kill.

那人被指控蓄意谋杀罪.

2.意思,含义

a.

1.热切的,急切的

There was an intent look on the young mother's face when she listened to her daughter reciting.

那位年轻妈妈在听女儿朗诵时脸上露出热切的神情.

2.专心致志的;坚决要做的[F][(+on/upon)]

He's intent on his work.

他正专心于工作.

He was intent on going abroad for advanced studies.

他一心想出国深造.

android 为什么用intent 进行数据交互

intendvt. 想要, 。

intentn. 意图, 目的, 意向。

adj. 专心的, 决心的, 热心的。

主要是词性不同。

想要;打算[+to-v][+v-ing][+(that)][O2]

He intends his son to manage the company.

他打算让他儿子经营该公司。

I intend studying abroad.

我打算出国留学。

I intend to study abroad.

我打算出国留学。

辅音

注:多数辅音的读音与拼音差别不大,可以通过拼音来进行谐音;还有一部分辅音没有对应的拼音字体,这里我们主要是针对/θ ?/这四个辅音。其中,/θ/和/?/这两个音标,它们并没有相近似的拼音来对应,主要是靠嘴形来记忆。

/θ/――上下牙齿咬着舌头尖,发“斯"的音;/?/――舌头顶上牙堂发拼音z一声;/?/――师;/?/――牙齿闭合,舌头虚碰牙齿发拼音r一声。

android中intent的作用

Android系统的一个重要特性就是一个应用程序可以调用另外一个应用程序来完成用户的请求动作。比如你的应用程序需要给用户显示一个地理位置在地图上,你不必在你的应用程序中实现地图功能,而是创建一个显示这个地理位置的Intent,发送出去,Android系统会启动那些可以处理这个请求的应用程序。还比如:你用百度云盘下载了一个pdf文档,你在点击打开这个文档的时候百度云盘是无法打开的,但是也许你系统上安装有其他的能打开pdf文档的阅读器,这个时候就会弹出一个对话框,列举了可以打开pdf文档的应用程序,你可以自由选择一个应用程序打开你下载的文档。

使用隐式Intent:

隐式Intent不会指明要启动的组件名称,而是声明执行的动作,动作指定了你想要做什么事情,比如显示(view),编辑(edit),发送(send),获取一些东西(get something)等。Intent经常会附带一些数据,比如你要查看的地址,发送邮件的内容等。数据形式依赖于你想要做什么事情,数据可以是一个Uri,也可以是其他数据类型(基本数据类型或者对象)之一。数据不是必须的,你的Intent中可以不包含data。

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

意图和意图过滤器Intents and Intent Filters

一个应用程序的三个核心组件-活动,服务和广播接收器是通过消息即意图(Intents)来激活的。Intent息传送是相同或不同应用中组件运行时晚绑定的一种机制。意图本身,一个意图对象,是一个包含被执行操作抽象描述的被动的数据结构-或者,对于广播而言,是某件已经发生并被声明的事情的描述。存在不同的机制来传送意图到每种组件中:

一个意图对象是传递给Context.startActivity()或者Activity.startActivityForResult()来启动一个活动或者让一个存在的活动去做某些新的事情。

一个意图对象是传递给Context.startService()来发起一个服务或者递交新的指令给运行中的服务。类似的,一个意图能被传递给Context.bindService() 来在调用组件和一个目标服务之间建立连接。作为一个可选项,它可以发起这个服务如果还没运行的话。

传递给任意广播方法(例如Context.sendBroadcast(),Context.sendOrderedBroadcast(), 或者Context.sendStickyBroadcast())的意图对象被传递给所有感兴趣的广播接收者。许多种广播产生于系统代码。

在每个例子里,Android系统找到合适的活动,服务,或者一组广播接收者来回应这个意图,必要时实例化它们。这些消息传送系统没有重叠:广播意图仅被传递给广播接收者,永远不会给活动或者服务。一个传送给startActivity()的意图是只会被传递给一个活动,永远不会给一个服务或广播接收者,如此类推。

这篇文档以意图对象的描述开始,然后描述Android映射意图到组件的规则-如何解决哪个组件应该接收一个意图消息。对于没有显式命名一个目标组件的意图,这个过程包括对照与潜在目标相关联的意图过滤器来测试这个意图对象。

意图对象Intent Objects

一个意图Intent对象是一堆信息。它包含接收这个意图的组件感兴趣的信息(例如将要取的动作和操作的数据)再加上Android系统感兴趣的信息(例如应该处理这个意图的组件类别和如何启动一个目标活动的指令):

组件名称Component name

应该处理这个意图的组件名字. 这个字段是一个ComponentName对象- 一个组合物:目标组件的完全合格的类名 (比如"com.example.project..FreneticActivity") 以及应用程序描述文件中设置的组件所在包的名字(比如, "com.example.project"). 这个组件名字的包部分和描述文件中设置的包名字不一定要匹配。

组件名字是可选的。如果被设置了,这个意图对象将被传递到指定的类。如果没有, Android使用另外的意图对象中的信息去定位一个合适的目标- 请看本文稍后描述的意图解析Intent Resolution。

组件名字通过如下方法:setComponent(),setClass(), 或者setClassName()设置并通过getComponent()读取。

intent对象有哪几个元素?各有什么作用?

Intent(意图)主要是解决Android应用的各项组件之间的通讯。

为了实现传递数据这个目的需要以下步骤

Activity1需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作

intent可调用putExtra来存放想要传递的数据

然后调用setClass,设置Activity1和欲调用的组件Activity2

最后调用startActivity将构造的Intent传入,系统会根据此Intent中的描述,到Activity1中找到满足此Intent要求的Activity,系统会调用找到的 Activity2最终传入Intent

在Activity2中可使用getIntent来获取传递的Intent,并通过获取数据的方法来获取数据

代码示例:

Intent?intent?=?new?Intent();?//?Activity1

intent.putExtra("one",?num1);?

intent.putExtra("two",?num2);?

intent.setClass(FirstActivity.this,?SecondActivity.class);?

startActivity(intent);?Intent?intent?=?getIntent();?//Activity2

String?num1?=?intent.getStringExtra("one");?

String?num2?=?intent.getStringExtra("two");?

int?ret?=?Integer.parseInt(num1)?+?Integer.parseInt(num2);?

result.setText(ret+"");

注意:我们在使用intent的时候可以使用bundle传递复制的数据类型。

Intent传递数据时,可以传递哪些类型数据

常见的有6个吧,如果我没记错的话

1.ComponentName这是指定接收此intent的activity。

2.Action这个是指定将要执行的动作

3.Data这是数据的类型,有URI何MIME类型两种的。

4.Category这个和第一条是对应的,是指定接收的component是什么类型的

5.Extras这是额外的参数信息

6.Flags这个是指示系统该怎么启动目标组件以及启动后怎么对待该组件

android 显示intent和隐士inent的区别

在Android应用的开发中,如果我们需要在不同的模块(比如不同的Activity之间)之间传递数据,通常有以下两种方法:

1. 利用Intent对象携带数据

通过查询Intent/Bundle的API文档,我们可以获知,Intent/Bundle支持传递基本类型的数据和基本类型的数组数据,以及String/CharSequence类型的数据和String/CharSequence类型的数组数据。而对于其它类型的数据貌似无能为力,其实不然,我们可以在Intent/Bundle的API中看到Intent/Bundle还可以传递Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。

所以要让非基本类型和非String/CharSequence类型的数据通过Intent/Bundle来进行传输,我们就需要在数据类型中实现Parcelable接口或是Serializable接口。

1.1 利用Parcelable接口实现数据通过Intent/Bundle进行传递

/**

* 代表一个人的信息

* @author gansc

*/

public class PersonInfo implements Parcelable

{

public String iName; // 人名

publicint iSex; // 性别

public String iId; // 号码

public String iMobileNumber; // 手机号码

public String iEMailAddr; // 邮箱地址

// From Parcelable

@Override

publicint describeContents()

{

return0;

}

// From Parcelable

// 保存到包裹中

@Override

publicvoid writeToParcel(Parcel dest, int flags)

{

dest.writeString(iName);

dest.writeInt(iSex);

dest.writeString(iId);

dest.writeString(iMobileNumber);

dest.writeString(iEMailAddr);

}

// 实现Parcelable接口的类型中,必须有一个实现了Parcelable.Creator接口的静态常量成员字段,

// 并且它的名字必须为CREATOR的

publicstaticfinal Parcelable.Creator<PersonInfo> CREATOR

=new Parcelable.Creator<PersonInfo>()

{

// From Parcelable.Creator

@Override

public PersonInfo createFromParcel(Parcel in)

{

PersonInfo brief =new PersonInfo();

// 从包裹中读出数据

brief.iName = in.readString();

brief.iSex = in.readInt();

brief.iId = in.readString();

brief.iMobileNumber = in.readString();

brief.iEMailAddr = in.readString();

return brief;

}

// From Parcelable.Creator

@Override

public PersonInfo[] newArray(int size)

{

returnnew PersonInfo[size];

}

};

}

tense tend intent 这三个词怎么辨析?

以下内容为CSDN上(网名:yuan1590)对安卓显示意图和隐身意图的总结(ps前人种树,树,后人乘凉,所以我就粘过来了,希望帮到您):

1. Intent

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,

Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生。

使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。

2. 显式意图、隐式意图

Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

如: 在 MainActicity 中打开一个新的 Acticity -- OtherActivity

1. Intent intent = new Intent();

2. intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));

3. 第二行代码可以更换为:intent.setClass(MainActivity.this, OtherActivity.class);

4. 也可以使用构造器来指定组件: Intent intent = new Intent(MainActivity.this, OtherActivity.class)

三种 “显式意图” 指定方式等价

隐式意图:没有明确指定组件名的Intent为隐式意图。

Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图

例如拨打电话的意图:

Uri uri = Uri.parse("tel:" + phoneCode);

Intent intent = new Intent(Intent.ACTION_CALL, uri);

对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

动作测试(Action test)

一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:

+ 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。

<intent-filter><!-- 空的 --></intent-filter>

+ 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

类别测试(Category test)

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。

原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。

但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。

因此自定义 Activity 的时候,不要以为光定义一个 action 就够了。这样用 startActivity() 来激活这个 Activity 的时候将一直报错。

原因就是,他内部要求去匹配 android.intent.category.DEFAULT 这个类别。

因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。

(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

数据测试(Data test)

当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。

例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;

如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;

如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。

当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:

a. 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。

b. 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。

这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。

c. 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。

d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。

如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。

换句话说,一个组件被定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。

Intent数据大小限制及TransactionTooLargeException异常

①tense :adj.紧张的;绷紧的;拉紧的;v.拉紧;使紧绷;n.(动词)时态

所以这个和另外两个构不成辨析词义;顶多也就是和tend的拼写相似点而已;如果你判断出是紧张”意味的形容词、比较级或最高级时,就用tense。

②tend :

vt.趋向;易于;朝向

vi.照料;照管

tend用作及物动词时,接名词、代词作宾语。可用于被动结构。例:

She tended her husband carefully during his illness.

她丈夫生病期间,她无微不至地照顾他。

tend用作不及物动词时,后接介词to, towards或动词不定式,表示“倾向于”。例:

Prices are tending upwards.

物价趋涨。

He tends to get very angry when people disagree with him.

当有人与他意见不一致时他很容易生气。

③intent:adj.热切的;专心的;决心的;n.意图;目的;意向;含义

intent用作形容词的基本意思是“专心的,专注的”,指人的思想、欲望或各种能力都急切地集中在某事上,也指把整个注意力放在某个具体的目标上; 也可表示“意愿坚决的,一心想…的”。常与介词on或upon连用,介词后可接名词或动名词。例:

He's intent on moneymaking.

他一心一意地赚钱。

She was charged with intent to defraud.

她被指控犯有蓄意钱财罪。

所以连用型是to的时候用tend;形容词接on或upon用intent;名词用intent;形容词表紧张用tense。

崩溃日志:

虽说一眼就看出是binder通讯引发的崩溃,但就如同OOM问题,定性问题容易,但定位问题却不容易。

官方说明:

1. TransactionTooLargeException

简单来说:一个应用进程的所有 AIDL 调用都是共用一个 Binder transaction buffer,而这个 buffer 的大小仅仅只是 1Mb,当所有的远程调用的参数或者这些调用返回值的大小加起来超过 1Mb 的话就会抛出 TransactionTooLargeException 异常。

2. Parcelables and Bundles

Binder 传输缓冲区是一个限制的大小的区域,大小为 1MB,这块缓冲区用于所有进程间的通信,也就是 Binder 通信。这些传输包括 onSeInstanceState , startActivity 和其他与系统的交互,当传输的数据超过这个大小的时候就会抛出异常。

特别是 onSeInstanceState 方法,因其需要在 Activity 返回的时候提供数据,建议是数据大小不大于 50K.

注意:

1.是不是只要通过 Bundle 传递数据,就会面临序列化的问题?

并不是,Activity 之间传递数据,首先要考虑跨进程的问题,而 Android 中又是通过 Binder 机制来解决跨进程通信的问题。涉及到跨进程,对于复杂数据就要涉及到序列化和反序列化的过程,这就注定是一次值传递(深拷贝)的过程。

Fragment 本身是不涉及跨进程的,这里虽然使用了 Bundle 传输数据,但是并没有通过 Binder,也就是不存在序列化和反序列化。和 Fragment 数据传递相关的 Bundle,其实传递的是原对象的引用。

结论:通过Fragment 的setArguments(Bundle) 传递一个 Bundle ,这里虽然使用了 Bundle 传输数据,但是并没有通过 Binder,也就是不存在序列化和反序列化。和 Fragment 数据传递相关的 Bundle,其实传递的是原对象的引用。(做个试验,弹出 DialogFragment 时传递一个对象,Dialog 中修改数据后,在 Activity 中该对象被修改了)

2.Activity onSeInstanceState 中保存的 Bundle 信息是存在内存中的,且因为是涉及到 Activity 的状态的保存,就需要交由 ActivityManager 进程去做一个管理,所以就需要 Binder 传输做一个跨进程的通信将 Bundle 的数据传递给 ActivityManager。因此 onSeInstanceState 也涉及到了 Binder 传输,自然而然就受到 Binder 缓冲区大小的限制.

3.FragmentStatePagerAdapter的实现有缺陷,因为其默认实现会持续保存历史Fragment实例的状态数据历史,在逐渐地积累、保存数据后,最终导致发送的数据包体积超过限制50KB

s://mmbiz.qpic.cn/mmbiz_jpg/liaczD18OicSz3ctQsLW8lGAAMWev0a16PZoqAev5CViaTTBuUZrWNG1m27sIicfKrYZicMmjdP4WwFO53vicWToC3Ag/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

使用EventBus postSticky()方法发送,它会将缓存到 stickyEvents 这个 Map 对象中,以待下次注册时,将这个取出,抛给注册的组件。

接收:

参考链接:

面试常客:Intent 能传递多大 Size 的数据?| 付阿里的建议方案!

Android----onSeInstanceState 的数据存在哪里?为什么限制了大小?

TransactionTooLargeException原因分析