Android API Guides 阅读笔记(3)----Intent and Intent Filter

来源:互联网 发布:上饶师范学校教务网络 编辑:程序博客网 时间:2024/06/05 22:45

Intent 是一个可以从App组件(Activity,Service,ContentProvider,BroadcastReceiver)请求动作(action)的消息对象,实现从一个组件跳转到另一个组件的功能,通过阅读文档,可以了解到:

  • Intent的三种基本使用场景

    • 启动一个Activity
    • 启动一个Service
    • 发送一个Broadcast
  • Intent的种类

    • 显示Intent,启动指定名字(组件的class类名)的组件

    • 隐式Intent,(设备上的任何App通过过滤匹配可以执行这个Action)没有指定名字,通过申明动作(action)执行,组件接收到这个动作便会执行相关代码,允许其他App中的组件处理这个action,隐式的Intent通过Intent Filter进行过滤
      注意,如果设备上没有App可以处理你指定的Intent,调用时你的App将会崩溃,为了防止这种事发生,最好在startActivity()之前调用resolveActivity()检测设备上是否有能执行此Intent的App,返回结果不会空则说明有,否则没有能执行此Intent的App,这时你就需要考虑使用其他方式处理你的Intent了

通常启动Service的Intent为显示的,这样子才安全,因为从Android 5.0之后,通过隐式的Intent调用bindService(),系统将会抛出异常

  • 发送一个Intent时的组成:

    • 需要启动的组件名字(className,通过如下方法设置:setCompontent(),setClass(),setClassName(),或者在Intent的构造方法中定义)隐式的Intent不需要申明组件名

    • 动作(Action,用于Intent Filter筛选的条件)通常系统有一些特定的Action可供调用,如ACTION_VIEW(启动一个查看内容的App),ACTION_SEND(启动一个可以发送数据App),创建自定义Action时,一定要记得加上包名,如:static final String ACTION_EXAMPLE=”com.example.action.EXAMPLE”

    • 数据和类型(data,type)Data是指定Action处理的对象,通常是以URi形式存在,Type用以指出Data的类型,例如一个Action为ACTION_EDIT,则它的Data应该是某个可编辑的文本的Uri,而它的Type应该指明这个文本的类型

    • 分类(Category):包含了需要处理Intent的组件的分类信息,(即,区分哪种类型的组件可以处理这个Intent) 在一个测试隐式Intent的例子中,因为接收端App的Activity中Intent Filter没有设置这个属性,导致始终不能跳转到接收端App中的Activity。 下面将会给出原因

    • 附件(Extras):用于传递键值对数据

    • 标志位(Flags):用来通知Android System如何运行一个activity和运行以后如何处理

  • 接收一个Intent时的组成:(通过定义Intent Filter过滤得到想要的Intent,通常在清单文件(AndroidManifest.xml)中使用< intent-filter >标签来过滤。)

    • < action >:申明可接受的动作名,用于匹配筛选出相同名的动作,其值必须为字符串而不能是常量类型,一个组件可以过滤多个Action

    • < data >:申明可以接收的数据类型,可以使用多组属性值进行多种数据类型匹配筛选

    • < category >:申明可以接收的Intent类型(注意为了能接收到隐式的Intent,必须在Intent Filter中添加默认类型,否则系统检测不到Intent匹配的Activity
      < category android:name="android.intent.category.DEFAULT"/>

    以上,一条基本的过滤器就申明完成

  • Intent Filter的过滤原则:(通常,在< intent-filter >节点下可以有多个< action >, < category >或 < data >节点用来对Intent进行匹配过滤筛选,其过滤筛选原则如下)

    • < action >:过滤器中可以列出多个动作,匹配时Intent中的action值只要有一个配对了,则通过

    • < category >:过滤器中可以列出多个分类,匹配时Intent中的category必须每一个都对应才能通过通过startActivity()启动的隐式Intent会有个默认的category:CATEGORY_DEFAULT常量,所以在< category >标签中必须要有个默认的值才能匹配到隐式Intent,这也就解释了上文中的那个测试。

通过设置该< intent-filter>对应的组件中的 exported属性为false,可以让你的组件只接受当前App内的Intent调用,也就是其他App通过隐式Intent不能调用你的组件

  • 待召意图(PendingIntent)意为即将发生的意图,是Intent的一种包装,首要目的是授予另一个程序权限,任由它像你的程序一样来执行相应的操作,其主要使用场景为:

    1. 申明一个将要执行的Intent,当用户点击通知时执行(因为不知道什么时候会有通知来)

    2. 申明一个将要执行的Intent,当用户点击桌面小插件的时候执行

    3. 申明一个将要执行的Intent,在指定的一个将来时间执行(也就是定时执行)
  • Intent和PendingIntent的主要区别,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent的。正由于pendingintent中 保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent, 就算在执行时当前App已经不存在了,也能通过存在pendingintent里的Context照样执行Intent,因此具有很大的灵活性

  • Common Intent
    之前说过,Intent既可以启动当前应用程序中的Activity,也可以启动设备上任意符合过滤条件的Activity,后者称为隐式Intent(implicit Intent),通常,使用隐式Intent是为了启动一个公用的Activity来完成当前应用程序不具备的功能,比如拍照,打开相册,播放音乐或视频,设备上已经有了具备这些功能的应用,通过隐式Intent就可以直接使用,并将结果返回给当前应用程序,因此,可以称这类Intent为Common Intent(公共Intent),通过阅读这节内容将会了解到如何调用一些系统应用程序,具体使用与参数配置,可以参考官方文档:Common Intents
    注意!在调用系统应用时,首先要确保申请了必须的权限

0 0