zoukankan      html  css  js  c++  java
  • 我来“广播”你的“意图”——Intent和Broadcast

    一:Intent基础

    三种方式

    1:通过startActivity启动一个新的Activity

    A:启动一个特定的Activity——

    Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);

    startActivity(intent);

    B:启动一个未指明的Activity——

    Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:131-111111"));

    startActivity(intent);

    并没有指定那个Activity去执行,只是把我们对启动Activity的描述信息放在Intent中

    C:处理一个Activity的返回值——startActivityForResult()

    2:通过broadcast Intent 机制可以将一个Intent发送给任何对这个Intent感兴趣的BroadcastRecevier

    3:通过startService(Intent)或者bindService(Intent,ServiceConnection,int)和后台的service进行交互

    二:一般一个Intent里对某操作的抽象描述包含以下几个部分

    1:对执行动作的描述:操作(Action)

    2:对这次动作相关联的数据进行描述:数据(data)

    3:对数据类型的描述:数据类型(type)

    4:对执行动作的附加信息进行描述:类别(category)

    5:其他一切附加信息的描述:附件信息(extras)

    6:对目标组件的描述:目标组件(component)

    Android自定义标准Action:

    ACTION_MAIN:标记当前activity为一个程序的入口

    ACTION_VIEW:将数据显示给用户

    ACTION_DIAL:用于描述给用户打电话的动作

    ACTION_PICK:从特定的一组数据中进行选择数据操作

    ACTION_EDIT:编辑特定的数据

    ACTION_DELETE:删除特定的数据

    与动作(Action)相关联的数据(Data)介绍

    android中采用指向数据的一个URI来表示data。如指向某个联系人的URI可能为:content://contacts/1

    VIEW_ACTION content://contacts/1  显示标识符为“1”的联系人的详细信息

    EDIT_ACTION content://contacts/1  编辑标识符为“1”的联系人的详细信息

    VIEW_ACTION content://contacts/  显示所有联系人的列表

    PICK_ACTION  content://contacts/  显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父Activity。例如,电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人

    Intent中的其他属性:

    1:类别:category——如LAUNCHER_CATEGORY表示Intent的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个

    2:组件:component——指定Intent的目标组件的类名称。通常android会根据Intent中包含的其他属性的信息,如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。如果component这个属性有指定的话,将直接使用它指定的组件,而不再执行上诉查找过程。指定了这个属性之后,Intent的其他属性都是可选的

    3:附加信息:extras——是其他所有附加信息的几何。

    三:android解析Intent实现

    1:直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context,Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。

    2:间接Intent:没有指定component属性的Intent

    对于直接Intent,android不需要解析,因为目标组件已经很明确。需要解析的是间接Intent,通过解析,将Intent映射给可以处理此Intent的Activity、Receiver或Service。

    Intent的解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent

    解析过程中,Android是通过Intent的action、type、category这3个属性来判断。判断方法:


    1:如果Intent指定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配

    2:如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配

    3:如果Intent中的数据不是具体内容,而是URI形式的话,则将根据Intent中数据的scheme(如:http:或者mailto:)进行匹配。同上,Intent的scheme必须出现在目标组件的scheme列表中

    4:如果Intent指定了一个或者多个category,这个类别必须全部出现在组件的类别列表中。如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别

    四:利用Intent来广播BroadCast事件

    1:程序主动广播Intent比较简单。在程序当中只需要构造好一个Intent,然后调用sendBroadcast进行广播即可:

    public static final String NEW_BROADCAST = "com.example.action.NEW_BROADCAST"
    Intent intent = new Intent(NEW_BROADCAST);
    intent.putExtras("data1", someData);
    intent.putExtras("data2", someData);
    sendBroadcast(intent);

    不管是系统广播的Intent还是其他程序广播的Intent,如果想接受并且对它进行处理的话,需要注册一个Broadcast Receiver,并且一般要给注册的这个Broadcast Receiver设置一个Intent Filter来制定当前的Broadcast Receiver是对那些Intent进行监听。

    对BroadcastReceiver进行注册:

    1:<receiver android:name = "exampleReceiver">
           <intent-filter>
          <action android:name="com.explam.action.NEW_BROADCAST" />
        </intent-filter>
      </receiver>

    2:代码中注册(不推荐,但是比较灵活)
    IntentFilter filter = new IntentFilter(NEW_BROADCAST);
    ExampleReceiver receive = new ExampleReceiver();
    registerReceiver(exampleReceiver, filter);

    注销:

    unregisterReceiver(exampleReceiver);

  • 相关阅读:
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    OA办公系统 Springboot Activiti6 工作流 集成代码生成器 vue.js 前后分离 跨域
    java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM
    最后阶段总结
    第二阶段学习总结
    第一阶段学习总结
  • 原文地址:https://www.cnblogs.com/mumue/p/2500653.html
Copyright © 2011-2022 走看看