意图和意图过滤器

Intent 和Intent Filters

1、Intent是一个可用于从其他应用程序组件请求操作的消息传递对象,促进组件之间的通信,有三种基本用途:

1) 启动activity:
在应用程序中,Activity代表着单个界面。可以传递一个Intent对象,使用startActivity请求一个新的Activity实例。Intent对象中携带了相关的数据和要请求的Activity.
当你启动一个新的Activity时,如果要想获取新的Activity返回之后的结果。可以通过startActivityForResult(),在当前的Acitivity中可以实现onActivityResult回调函数进行后续处理。

2) 启动service
Service在后台执行相应的操作但是不提供用户交互界面。可以通过Intent的startService()启动一个Service去处理执行一次操作,例如:下载文件。可以通过传递Intent到另一个组建来绑定服务bindService()。

3) 传递广播
广播是任何应用都可以接收的消息。系统为系统事件提供各种广播,例如系统启动或设备开始充电。可以通过传递intent给其他应用程序,或者向其他应用程序发送广播。

2、意图类型:

显示意图:通过名称指定组件,通过使用明确的意图来启动自己应用程序中的组件,因为要知道要启动的活动或服务的类名称。例如,响应用户操作启动新活动或者启动后台下载服务。

隐式意图:不指定特定的组件,而是声明要执行的一般操作,允许来自另一个程序的组件来处理它,例如,如果要向用户提供地图位置,则可以使用隐式意图来请求另一个有能力的应用程序来显示指定位置。
这里写图片描述
图示:说明了一个隐式意图传递的过程1)Activity A 实例化一个Intent并传递给startAcvitity()方法,2)系统会查找所有的意图过滤器,可以接受此意图的ActivityB,3)系统会调用B的onCreate()方法并且传递该意图。

值得注意的是:如果有多个Activity的意图过滤器都可以处理,则系统会提供一个对话框供用户选择。如果Activity没有声明意图过滤器,则只能通过显示意图来启动。

3、建立意图:
一个意图主要包含:
要启动组件的名称:如果通过显示意图来启动,则它是关键信息,这样会启动指定的Activity。如果没有指定名称,则是隐式意图,系统会查找配置文件查找那个组件接收此意图。
action 指定要执行操作信息的字符串。ACTION_VIEW、 ACTION_SEND等
数据:引用要处理的数据
类别:包含有关应该处理意图的组件种类的附加信息的字符串。任何数量的类别描述都可以放在意图中,但大多数意图不需要类别。以下是一些常见类别:
CATEGORY_BROWSABLE
CATEGORY_LAUNCHER该活动是任务的初始活动,并列在系统的应用程序启动器中。
上面列出的这些属性(组件名称,操作,数据和类别)表示意图的定义特征。通过阅读这些属性,Android系统能够解析应该开始哪个应用程序组件
Extras:键值对,带有完成请求的操作所需的附加信息。
Flags:在Intent类中定义的标志用作意图的元数据。标志可以指示Android系统如何启动活动(例如,活动应该属于哪个 任务)以及在启动后如何对待它(例如,它是否属于最近活动的列表)

例子:
显式意图:

Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

隐式意图 //

Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

当多个组件可以接收一个隐式意图时,系统会提供一个对话框供用户选择。

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...


String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

接收隐式意图:每个意图过滤器根据意图的操作,数据和类别来指定它接受的意图的类型。只有当意图可以通过您的一个意图过滤器时,系统才会向您的应用程序组件传递隐含的意图。
注意:无论任何意图过滤组件声明,显式意图始终都会传递给其目标。

每个意图过滤器由<intent-filter> 应用程序的清单文件中的一个元素定义,嵌套在相应的应用程序组件(如<activity> 元素)中。在其中<intent-filter>,您可以使用以下三个元素中的一个或多个来指定要接受的意图类型:
<action>在name属性中声明接受的意图操作。该值必须是操作的文字字符串,而不是类<data>受的数据类型,使用一个或多个指定数据URI和MIME类型的各个方面<category>性中接受的意图类别name。

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

示例过滤器

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

当你调用startActivity()或者startActivityForResult(), 传递一个隐式意图,系统就会解析并处理这个意图,启动相应的Activity,如果有多个可以接收该意图的应用,系统会提供选项,让用户决定。如果不存在能接收该意图的应用,应用程序调用会崩溃。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值