zoukankan      html  css  js  c++  java
  • Intent (一)

    1,简介

    Intent 是一种消息传递机制,可以理解为一种对消息的封装,执行某操作的抽象描述,可用于应用程序内部及应用程序之间

    其组成包括:

    • 要执行的动作(action)

    如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android定义了一套标准动作:
    MAIN_ACTION
    VIEW_ACTION
    EDIT_ACTION
    PICK_ACTION
    GET_CONTENT_ACTION
    DIAL_ACTION
    CALL_ACTION
    SENDTO_ACTION
    ANSWER_ACTION
    INSERT_ACTION
    DELETE_ACTION
    RUN_ACTION
    LOGIN_ACTION
    CLEAR_CREDENTIALS_ACTION
    SYNC_ACTION
    PICK_ACTIVITY_ACTION
    WEB_SEARCH_ACTION

    Android也支持自定义动作,并可定义相应的Activity来处理它,建议使用一个描述性的 唯一的字符串,所以最好使用基于JAVA包的命名约定的命名系统。

    • 执行动作要操作的数据(data)

    采用指向数据的一个URI来表示,

    如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。
    这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。
    以联系人应用为例,以下是一些action / data对,及其它们要表达的意图:
    VIEW_ACTION content://contacts/1-- 显示标识符为"1"的联系人的详细信息
    EDIT_ACTION content://contacts/1-- 编辑标识符为"1"的联系人的详细信息
    VIEW_ACTION content://contacts/-- 显示所有联系人的列表
    PICK_ACTION content://contacts/-- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人

    • 附加属性:
      • category(类别),被执行动作的附加信息
      • type(数据类型,显式指定Intent的数据类型(MIME)
      • component(组件),指定Intent的的目标组件的类名称
      • extras(附加信息),是其它所有附加信息的集合

     

    总之,action、 data/type、category和extras 一起形成了一种消息通信机制。
    这种消息使系统能够理解诸如“查看某联系人的详细信息”之类的信息。
    随着应用不断的加入到系统中,它们可以添加新的action、 data/type、category来扩展这种消息通信机制。
    应用也可以提供自己的Activity来处理已经存在的这样的消息,从而改变这些消息的行为。

     

    可以用于:

    • 显式启动一个特定的Service或Activity;
    Intent intent = new Intent(MyActivity.this, SelectHorseActivity.class);
    startActivity(intent);
    • 隐式启动Service或Activity来执行一个动作的Intent,支持运行时迟绑定,不必事先知道需要启动哪个应用程序或Activity,这意味着可以创建使用其它应用程序功能的项目,而不必提前确切知道是哪个应用程序提供了这种功能;
    Uri uri = Uri.parse("content://contacts/people");
    Intent intent = new Intent(Intent.ACTION_PICK, uri);
    startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
    • 广播某个事件已经发生
    Intent intent = new Intent(LifeformDetectedReceiver.NEW_LIFEFORM);
        intent.putExtra(LifeformDetectedReceiver.EXTRA_LIFEFORM_NAME,
                        detectedLifeform);
        intent.putExtra(LifeformDetectedReceiver.EXTRA_LONGITUDE,
                        currentLongitude);
        intent.putExtra(LifeformDetectedReceiver.EXTRA_LATITUDE,
                        currentLatitude);
        sendBroadcast(intent);

    优点:

    • 支持应用程序之间的通信,从而把设备从一个包含相互独立的组件集合的平台变成一个互联的系统
    • 支持在系统范围内广播消息,从而可以支持基于内部的,系统的或者第三方应用程序的事件创建事件驱动的应用程序
    • 隐式调用实现调用者与被调用者之间的松耦合,利于系统的扩展与维护

    最佳实践:

    • 使用Intent来传播动作(隐式启动,运行时迟绑定),而不是显式地加载类,这种设计方法使组件之间实现分离,允许无缝地替换应用程序元素

    2, Intent resolution--Intent 解释

    对于运行时迟绑定,系统决定启动哪一个匹配组件(activity,service,broadcast receiver)的过程叫做Intent resolution

    Android将已安装包的可用的Intent Filter放到一个列表中,再按以下原则进行匹配,把不匹配的Intent Filter从列表中删除直到找到匹配的Intent Filter

    1、执行的动作(action)和执行动作要操作的数据(data)必须匹配

    2、如果Intent Filter指定了scheme,host/authority,path或者MIME类型,那么这些值都要和Intent的URI匹配

    一般情况下,intent-filter中只要包含action和category就足以满足很多需求。在实际解析过程中,如果一个组件的intent-filter中没有声明任何action,那么任何intent都能与该组件的action相匹配;但是如果一个intent-filter中没有声明任何category,那么这个组件只能与没有指定任何category的intent相匹配。需要注意的是:在隐式调用activity时,系统会自动给intent中加入android.intent.category.DEFAULT的category,所以如果一个intent-filter中不声明Ddefault的category就会导致intent匹配不到任何组件。

    对于Broadcast Receiver,每个匹配的接收器都将接收Broadcast Intent

    实例见 Intent (二)

  • 相关阅读:
    Chapter 5. 集合---(ArrayList、Stack、queue、哈希表)
    Chapter 4. 数组
    第一章 代码无错就是优?——简单工厂模式
    条款34:区分接口继承和实现继承
    条款33:避免遮掩继承而来的名称
    条款32:确定你的public继承塑模出is-a关系
    条款12:复制对象时勿忘其每一部分
    A:魔兽世界之一:备战
    条款09:绝不在构造和析构过程中调用virtual函数
    7、数值算法
  • 原文地址:https://www.cnblogs.com/mshwu/p/3304396.html
Copyright © 2011-2022 走看看