首页 > 代码库 > Intent

Intent

Intent

Intent 作用(两个):

  1. 激活系统组件

    startActivity(Intent)

    startService(Intent)  / stopService(Intent)

    bingService(Intent, ServiceConnection, int)

  2. 在系统组件之间传递数据(依赖于intent的属性)

 

Intent 属性(一共6个,常用4个)

    1. ComponentName: 组件名称.  用于显式地指定被激活的组件, 在Intent显示的激活系统组件时, 通过ComponentName属性来完成的.

        例子:  

          Intent intent = new Intent(this, SecondActivity.class);   //  在这里已经很明确的指出我们需要激活的Activity 是SecondActivity

              / 而这个SecondActivity 变量就是CommentName

          startActivity(intent)

          ==> 等价于:

          Intent intent = new Intent();     

          ComponentName commentName = ComponentName(this, 包名.StartActivity);

          intent.setComponentName(commentName);

          startActivity(intent);     

    2. Action: 动作. 用于隐式地指定被激活的组件, 被激活的组件可以是其他应用的组件, 如果是显示的只能是自己的组件

        例子:

          Intent intent = new Intent();

          intent.setAction(Intent.ACTION_DIAL);  // 隐式激活时, 你不知道激活的到底是哪个Activity, 里面的参数是字符串,

                   /如果是自己的Action, 可以在项目清单(Manifest.xml)中配置action, 然后

                      <intent-filter>

                        <action adroid:name="intent_action" />

                        <action adroid:name="intent_action2" />    // 可以重复写多次同一个属性

                        <category android:name="android.intent.category.DEFAULT" />  // 默认就有

                        <category android:name="hello" />  // 如果在代码中使用了intent.setCategory()这里就需要些多个

 

                      </intent-filter>

          intent.addCategory("hello");

          Data data = http://www.mamicode.com/Uri.parse("tel://10086");

          intent.setData(data);

          startActivity(intent)

    3. Data: 数据. 用于封装数据, 通常与Activity同时使用. 该属性是Uri 类型的, 可以通过Uri.parse(String)获取该类型的数据

    4. Category: 分类. 用于Intent与IntentFilter的过滤 (没什么其他软用)

    5. Extra: 附加数据.  Extra属性的类型是Bundle, 而Bundle的本质是操作HashMap<String, Object>, 由于Bundle中的Map不可以被直接操作,

             且Bundle提供了一些了API想Map中封装数据, 而Intent的Extra是进阶操作Map的,

          所以Intent是Extra属性可以防止Bundle中约定的数据类型的数据

        例子: 

          intent.putExtra("name", "小明");   // 向intent添加额外数据

          intent.getStringExtra("name");  // 在另一个Activity中获取这个传过来的数据

    6. Flag: 标记,标识. 通常用于激活Activity时, 指定特殊的参数.

        相关方法: setFlags(int), addFlags(int)

 

Intent 与 IntentFilter

  IntentFilter 是 "意图过滤器", 用于处理Intent的匹配(拦截/放行), 即使得某些Intent能够成功匹配, 从而放行; 某些Intent不能被匹配, 从而达到拦截

  IntentFilter 对于Intent的匹配通常从Action属性, Category属性进行过滤, 也可以根据Data属性过滤

    如果从Action / Category 进行过滤, 可以简单的认为规则是: IntentFilter中配置的属性比Intent中的只能更多不能更少. (你可以在IntentFilter配置

                                  中写多个action来达到IntentFilter 配置属性比Intent 属性更多)

  注意: 每个Intent对象中默认即存在一个一个category

 

Parcelable接口:

  Android 中的Parcelable接口的作用类似于Java中的Serializable接口, 用于实现类的成员的序列化. Java中有序列化接口(自动序列化).

  抽象方法:

    1. describeContents() 保持默认,不需要动它

    2. writeToParcel(Parcel dest) {    // 将数据写入Parcel(放数据的容器)

       dest.writeString(path);

       dest.writeString(name);

      }

  实现步骤:

    1. 自定义类, 实现Parcelable接口

    2. 重写捏的describeContents()方法, 直接返回0即可

    3. 重写的writeToParcel(Parcel, int)方法, 调用穿男生的write洗礼方法向Parcel容器内依次写入本类的各属性

    4. 声明public static final Parcelable.Creator<T> CREATOR常量, 并使用匿名内部类赋值(也可以使用其他内部类语法), 在匿名内部了中, newArray(int)方法直接根据参数创建对应长度的数组createFromParcel(Parcel)中, 创建出本类的对象, 并从参数中依次(与此前写入时保存一直, 先写入先读取, 后写入后读取)读取数据为本类的对象属性赋值.

注:

获取包名的方法, getPackageName()

在配置文件(Manifest.xml)中的Activity属性名命名规则:  "公司域名.action.SECOND"  或 "公司域名.category.HELLO"

 

Intent