我来“广播”你的“意图”——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);

原文地址:https://www.cnblogs.com/mumue/p/2500653.html