Activity面试题之Intent篇

本文详细介绍了Android中Intent的工作原理,包括Action匹配、URI数据匹配和Category类别匹配。Action是定义组件动作的字符串,IntentFilter用于过滤。URI携带外部数据,通过scheme、host等属性匹配。Category则是组件类别列表,所有项目匹配才能成功。Intent能传递各种数据类型,如基本类型、String和实现了Serializable或Parcelable的对象。Parcelable在性能上优于Serializable,适合内存序列化。显式Intent直接指定组件,用于内部通信;隐式Intent通过IntentFilter寻找最合适组件,适用于跨应用交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Action 匹配:Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 IntentFilter 可以包含多个 Action。在 AndroidManifest.xml 的 Activity 定义时可以在其 节点指定一个 Action 列表用于标示 Activity 所能接受的“动作”,例如:

……

如果我们在启动一个 Activity 时使用这样的 Intent 对象:

Intent intent =new Intent();

intent.setAction(“cn.itheima.action”);

那么所有的 Action 列表中包含了“cn.itheima”的 Activity 都将会匹配成功。

Android 预定义了一系列的 Action 分别表示特定的系统动作。这些 Action 通过常量的方式定义在 android.content. Intent 中,以“ACTION_”开头。我们可以在 Android 提供的文档中找到它们的详细说明。

URI 数据匹配:一个 Intent 可以通过 URI 携带外部数据给目标组件。在 节点中,通过节点匹配外部数据。

mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。如下:

电话的 uri tel: 12345 http://www.baidu.com ,自己定义的 uri itcast://cn.itcast/persons/10

如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时 URI 数据匹配才会成功。

Category 类别匹配:节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。


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


Intent 可以传递的数据类型非常的丰富,java 的基本数据类型和 String 以及他们的数组形式都可以,除此之外还可以传递实现了 Serializable 和 Parcelable 接口的对象。


3.Serializable 和 Parcelable 的区别


在使用内存的时候,Parcelable 类比 Serializable 性能高,所以推荐使用 Parcelable 类。

  • 1.Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。

  • 2.Parcelable 不能使用在要将数据存储在磁盘上的情况。尽管 Serializable 效率低点,但在这种情况下,还是建议你用

Serializable 。

实现

1.Serializable 的实现,只需要继承 Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

2.Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承Parcelable.Creator 接口。

public class MyParcelable implements Parcelable { private int mData;

public int describeContents() { return 0;

}

public void writeToParcel(Parcel out, int flags) { out.writeInt(mData);

}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in);

}

public MyParcelable[] newArray(int size) { return new MyParcelable[size];

}

};

private MyParcelable(Parcel in) { mData = in.readInt();

}

}


4.隐式、显式Intent的区别


  • 显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件,它一般用在知道目标组件名称的前提下,显式Intent更多用于在应用程序内部传递消息。

  • 隐式意图:没有明确指定组件名的Intent为隐式意图,通过IntentFilter来实现的,Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(Uri和数据类型)找到最合适的组件来处理这个意图,它一般用在没有明确指出目标组件名称的前提下,它更广泛地用于在不同应用程序之间传递消息。


关于整理问题

=====================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值