四种组件类型中的三种,Activity,Service和Broadcast receiver是通过名为意图(intent)的异步消息进行启动.Intent 会在运行时将各个组件相互绑定,可以将 intent 视为其他组件派来请求一个执行动作(action)的信使,无论这个组件是否属于你的应用.
Intent通过Intent对象来创建.如果是显式的意图(explicit intent),它定义的消息可以启动指定的组件;如果是隐式的意图(implicit
intent),它定义的消息可以用来启动指定类型的组件.
- 对于activities和services,intent可以定义要执行的动作(例如,“查看”或“发送”某个内容),并且可以指定要执行动作的数据的 URI(以及正在启动的组件可能需要了解的信息).
例如,intent传达的请求可以是启动一个activity来显示图像或打开网页.在某些情况下,我们可以启动activity来接收结果,在这种情况下,activity也会在intent中返回结果(例如,我们可以发出一个intent,让用户选取某位联系人并将其返回给我们,
返回的intent包括指向所选联系人的URI). - 对于broadcast receiver,intent只会定义要广播的通知.例如,指示设备电池电量不足的广播只包括指示“电池电量不足”的已知操作字符串.
-
Intent不会启动另一个组件类型:content
provider,后者是在成为ContentResolver的请求目标时启动. content resolver通过content
provider处理所有直接事务,所以请求信息的组件就无需执行事务,只要在ContentResolver对象上调用方法就可以了.这会在content provider与请求信息的组件之间留出一个抽象层以确保安全.
每种类型的组件有不同的启动方法:
-
我们可以通过将Intent传递到startActivity()或startActivityForResult()(当我们想让 Activity 返回结果时)来启动Activity(或为其安排新任务).
-
从Android 5.0 (API level 21)开始,我们可以通过使用JobScheduler来预设动作.对于其他早期版本我们可以通过将Intent传递到startService()来启动服务(或对执行中的服务下达新指令).我们也可以通过将Intent传递到bindService()来绑定到该服务.
-
可以通过将Intent传递到sendBroadcast(),sendOrderedBroadcast()或sendStickyBroadcast()等方法来发起广播;
-
可以通过在ContentResolver上调用query()来对内容提供程序执行查询.
如需了解有关Intent用法的详细信息,请参阅Intent和Intent 过滤器文档.
网友评论