• Intent和Intent Filters


    什么是Intent

        Intent是android开发中的重要对象,它作为一个信息承载对象存在。
        我们可以在使用其他一些组件的时候从Intent获取行为响应的准则(即应该做什么东西,如何做)
     
    Intent的三种基本使用场景
    启动一个Activity:
        通过传递一个Intent对象给startActivity(Intent intent)方法,可以启动一个Activity
     
    启动一个服务:
        像启动Activity一样,我们也可以传递一个Intent对象给startService(Intent intent),从而启动一个服务。
     
    发送一个广播:
        我们先不管广播是什么东西,现在我们只需要知道向sendBroadcast(Intent intent)方法传递一个Intent对象,就可以发送广播。
        当然,这不是创建广播的全部内容。
     
    Intent的类型
    intent类型有两种
        显式Intent:需要使用组件的类的全名创建。
                   因为我们知道自己创建的类名称,所以一般这个方法在自己的程序内部使用。
    显式Intent的创建方法: 
     
    //this为应用程序的上下文,MyActivity是自定义类
    Intent intent = new Intent(this, MyActivity.class)
     
        隐式Intent:可以在androidManifest注册组件的时候使用intentfilter标签创建。
                   只要系统匹配到这个intentfilter,该组件就会被运行。
     
    创建隐式Intent的例子(以启动Activity为例):
    AndroidManifest文件中有如下Activity的定义
    默认情况下,你的隐式intent必须包含 CATEGORY_DEFAULT category
    如果没有,系统就找不到你的Activity
    建议使用你的应用程序的包名+action名称作为action的字符串
    <activity
    android:name="com.example.intentdemo.IntentActivity"
    android:label="@string/title_activity_intent" >
    <intent-filter>
         <action android:name="com.example.MYACTION" />
         <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    </activity>
     
    在程序中我们可以使用下面的代码启动这个Activity
    Intent intent = new Intent("com.example.MYACTION");
    startActivity(intent);
     
    需要注意的是,当我们需要使用Intent启动一个服务的时候,最好使用显式Intent
    因为我们并不知道系统中有多少个使用相同名称定义的服务组件,当启动服务的时候,
    我们也不知道到底启动了哪个服务,也无法看到是哪个服务。
    从android5.0开始,当我们使用隐式intent传递给bindService()函数的时候,
    系统就会抛出异常。
     
    Intent里面所包含的信息
    既然intent是用来承载信息的,那么它到底可以装载什么信息呢?
    1.组件名称:
    如,Activity名称,Service名称等。当我们使用显式intent的时候,
    我们就要使用这些组件的名称来构造Intent
    2.Action(包含在AndroidManifest文件中)
        指定Intent执行什么动作的字符串
        系统已经为我们预先定义了一系列的字符串,我们拿来即可以用。
        具体可以看Intent的官方文档。
        我们也可以定义自己的字符串,只要在<intent-filter>标签里的<action />标签里定义即可
    3.Data(包含在AndroidManifest文件中,具体可定义下面的内容)
    <data android:scheme="string"
          android:host="string"
          android:port="string"
          android:path="string"
          android:pathPattern="string"
          android:pathPrefix="string"
          android:mimeType="string" />
    包括指向你要操作的数据的Uri或者你的组件可处理(接受)的数据的类型
    例如你的action指定为ACTION_EDIT,那么你的Data包含的Uri就是你要编辑的文件的Uri(可以理解为文档路径)
     
    android:scheme属性:用于指定Uri的类型,如网络类型的http,ContentProvider类型的content
    android:scheme="http"
    android:scheme="content"
    如果scheme没有被设置,那么所有的Uri属性将被忽略
    如果host没有被设置,那么所有的port属性和path属性将被忽略
    如果你的<intent-filter>设置了数据类型(mimeType),但是没有设置scheme
    那么系统假设你的Uri类型是content或者file
     
    setDate()方法和setType()方法
        这两个方法用于设置组件的Uri和数据类型(对应AndroidManifest文件中的schema和mimeType)
        但是,当我们需要同时设置Uri和mimeType的时候,我们不能同时使用这两个方法,而是应该使用setDataAndType()方法。
     
    4.Category
        我们可以使用系统预定义的分类,也可以定义自己的分类。
        还记得我们使用隐式intent的时候需要设置CATEGORY_DEFAULT分类吗。
     
    5.Extras
        顾名思义,即额外的东西,以键值对的方式保存。
        你可以使用Intent来传递你可以想象得到的数据类型,如,int,String,Array等
  • 相关阅读:
    【Qt开发】几个傻不拉几关于char*和const char*的不兼容问题
    【Qt开发】几个傻不拉几关于char*和const char*的不兼容问题
    【Qt开发】Qt让线程休息一段时间
    【Qt开发】Qt让线程休息一段时间
    【Linux开发】如何在./configure的时候将编译参数传入,改变默认的编译器gcc成arm-linux-gcc
    【Linux开发】如何在./configure的时候将编译参数传入,改变默认的编译器gcc成arm-linux-gcc
    【Linux开发】【DSP开发】利用CCS6.1生成out文件的同时生成bin文件
    【Linux开发】【DSP开发】利用CCS6.1生成out文件的同时生成bin文件
    【Linux开发】CCS远程调试ARM,AM4378
    【Linux开发】CCS远程调试ARM,AM4378
  • 原文地址:https://www.cnblogs.com/ai-developers/p/4191568.html
Copyright © 2020-2023  润新知