组件之间的通信桥梁——Intent

Intent

显式Intent:

通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class));
每次启动的组件只有一个~

隐式显式Intent:

不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时,
会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件(必须Action和Category同时匹配上算匹配成功),当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框~

具体用法

//FirstActivity中
Intent intent = new Intent("com.example.intentdemo.ACTION_START");
                //action和category同时匹配上了才能启动activity
                intent.addCategory("com.example.intentdemo.CATEGORY1");//一个Intent只可以有一个Category
                intent.setData(Uri.parse("http://www.baidu.com")); 

//AndroidManifest.xml中
<activity android:name=".SecondActivity" >
 <intent-filter>
 	 <action android:name="com.example.activitytest.ACTION_START" />
	 <category android:name="android.intent.category.DEFAULT" />
 	 <category android:name="com.example.activitytest.MY_CATEGORY"/>
 	 <data
            android:host="com.example.project"
            android:path="/folder/subfolder/etc"
            android:port="200"
            android:scheme="http" />
 </intent-filter>
</activity> 

data标签的使用
android:scheme。用于指定数据的协议部分,如上例中的 http 部分。
android:host。用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
android:port。用于指定数据的端口部分,一般紧随在主机名之后。
android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

组件中启动的方法

startActivity(Intent) / startActivityForResult(Intent):来启动一个Activity

startService(Intent)/bindService(Intent):来启动一个Service

sendBroadcast(Intent):发送广播到指定BroadcastReceiver

使用Intent传递数据数据

  1. 基本数据可以直接调用putExtra(key,value)方法,然后取的时候通过getXxxExtra(key)方法进行取值,其中Xxx为value的类型。
  2. 调用setData(URI uri)方法,参数需要URI,然后取的时候调用getData,返回类型为URI。
  3. 传递对象
    方式1:Serializable
    将需要传递对象的实体类实现java.io.Serialization接口(序列化,不需要重写任何方法然后在取的地方使用
    Person person = (Person) getIntent().getSerializableExtra("person_data");
    补充:
    序列化:一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;
    反序列化:从字节流创建对象的相反的过程称为反序列化。
    方式2:Parcelable
    实体类实现Parcelable接口,重写以下方法
 @Override
 public int describeContents() {
 return 0;
 }
 @Override
 public void writeToParcel(Parcel dest, int flags) {
 dest.writeString(name); // 写出 name
 dest.writeInt(age); // 写出 age
 }
 public static final Parcelable.Creator<Person> CREATOR = new Parcelable.
 Creator<Person>() {
 @Override
 public Person createFromParcel(Parcel source) {
 Person person = new Person();
 person.name = source.readString(); // 读取 name
 person.age = source.readInt(); // 读取 age
 return person;
 }
 @Override
 public Person[] newArray(int size) {
 return new Person[size];
 }

取的时候用:

Person person = (Person) getIntent().getParcelableExtra("person_data"); 

比较和选用
Serializable 的方式较为简单,但由于会把整个对象进行序列化,因此效率会比 Parcelable 方式低一些,所以在
通常情况下还是更加推荐使用 Parcelable 的方式来实现 Intent 传递对象的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值