Android应用组件及Intent

1、四大应用组件

①Activity,Activity 表示应用中的一个屏幕,在manifiest中的声明方式:<activity>

②服务Service,Service 是一个不使用用户界面而在后台执行操作的组件,在manifiest中的声明方式:<service>;

③内容提供程序ContentProvider,在manifiest中的声明方式:<provider>;

④广播接收器BroadcastReceiver,在manifiest中的声明方式:<receiver>;广播接收器作为BroadcastReceiver 的子类实现,并且每条广播都作为 Intent 对象进行传递。

其中,四种组件类型中的三种—Activity、服务和广播接收器,通过名为 Intent 的异步消息进行启动。

2、Intent概述

Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。

(1)启动 Activity:

通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了所有必要的数据。

如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的onActivityResult() 回调中,您的 Activity 将结果作为单独的 Intent 对象接收。

(2)启动服务:

通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作。Intent 描述了要启动的服务,并携带了所有必要的数据。

如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务。

为了避免无意中运行不同应用的 Service,请始终使用显式 Intent 启动您自己的服务,且不必为该服务声明 Intent 过滤器。使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务将响应 Intent,且用户无法看到哪些服务已启动。从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会引发异常。

(3)传递广播:

广播是任何应用均可接收的消息。通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或sendStickyBroadcast(),您可以将广播传递给其他应用。

广播接收器的过滤器可以通过调用 registerReceiver() 动态注册。之后,您可以使用 unregisterReceiver() 注销该接收器。这样一来,应用便可仅在应用运行时的某一指定时间段内侦听特定的广播。

3、Intent分类

Intent分为两种类型:

显式 Intent:按名称(完全限定类名)指定要启动的组件。

创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。

隐式 Intent :并不指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。

创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。如果Intent与Intent过滤器匹配,则系统将启动该组件,并向其传递Intent对象。

4、Intent对象

Intent 对象携带了Android系统用来确定要启动哪个组件的信息,以及收件人组件为了正确执行操作而使用的信息。

Intent对象中包含的主要信息如下:

①组件名称:要启动的组件名称。

您可以使用setComponent()、setClass()、setClassName()或Intent构造函数设置组件名称。通过该信息确定显式Intent所传递给的应用组件,隐式Intent不指定组件名称,系统将根据其他Intent 信息决定哪个组件应当接收Intent。

②操作:指定要执行的通用操作(例如,“查看”或“选取”)的字符串。

您可以使用 setAction() 或 Intent 构造函数为 Intent 指定操作。以下是一些用于启动 Activity 的常见操作:

ACTION_VIEW:如果您拥有一些某项Activity可向用户显示的信息,则指定该操作

ACTION_SEND:如果您拥有一些用户可通过其他应用共享的数据,则指定该操作

此外,您可以定义自己的操作,并请确保将应用的软件包名称作为前缀。例如:static final String ACTION_TIMETRAVEL ="com.example.action.TIMETRAVEL";

③数据:引用待操作数据和/或该数据MIME类型的URI(Uri对象)。数据类型通常由Intent的操作决定。

要仅设置数据URI,请调用setData()。要仅设置MIME类型,请调用setType()。如有必要,您可以使用setDataAndType()同时显式设置二者。

④类别:指定可接收该Intent 的组件的类型

您可以使用 addCategory() 指定类别。以下是一些常见类别:

CATEGORY_BROWSABLE:目标Activity允许本身通过网络浏览器启动。

CATEGORY_LAUNCHER:该Activity是任务的初始Activity。

⑤Extra:携带完成请求操作所需的附加信息的键值对。

您可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。您还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将Bundle 插入 Intent 中。

⑥标志:指定如何处理该Intent

使用setFlags()设置标志,其中,FLAG_ACTIVITY_*标志用于Context.startActivity(),FLAG_RECEIVER_*标志用于Context.sendBroadcast()。

5、Intent过滤器

Intent过滤器是应用清单文件中的一个表达式,它指定该组件要接收的 Intent 类型。

每个Intent过滤器均根据Intent的操作、数据和类别指定自身接受的Intent类型。仅当隐式Intent可以通过Intent过滤器之一传递时,系统才会将该Intent传递给应用组件。

每个 Intent 过滤器均由应用清单文件中的 <intent-filter> 元素定义,并嵌套在相应的应用组件(例如<activity>元素)中,一个应用组件可以有多个<intent-filter>。

在<intent-filter>内部,您可以使用以下三个元素中的一个或多个指定要接受的 Intent类型:

<action>:在name属性中,声明接受的Intent操作。该值必须是操作的文本字符串值,而不是类常量。

<data>:使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。

<category>:在name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。

Android 会自动将 CATEGORY_DEFAULT类别应用于传递给 startActivity() 和 startActivityForResult()的所有隐式 Intent。因此,如需Activity接收隐式 Intent,则必须将"android.intent.category.DEFAULT" 的类别包括在其 Intent 过滤器中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值