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