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);

  • 相关阅读:
    mybatis_7分页查询
    mybatis_6日志工厂
    mybatis_5解决属性名和字段名不一致的问题(resultMap)
    mybatis_4配置解析
    mybatis_3CRUD操作
    ARM C函数调用堆栈入栈顺序
    syscall SYSCALL_DEFINE*()实现
    ko kallsyms
    elf文件结构解析
    ko module加载flow
  • 原文地址:https://www.cnblogs.com/mumue/p/2500653.html
Copyright © 2011-2022 走看看