Intent简介

Android中可以使用Intent启动Activity,启动Service,发送broadcast等。

  • 显式意图 明确指定要启动的组件的类全名,在自己的应用中启动另一个Activity或Service经常使用这种做法。
  • 隐式意图 通过意图调用其他应用经常使用隐式意图。

发送隐式意图,安卓系统会在各个应用的manifest文件中寻找intent-filter匹配的组件,然后执行意图的操作。如果有多个匹配的应用,例如启动浏览器时,用户装了多个浏览器,这时就会弹出对话框问用户启动哪一个浏览器。

Intent的使用

创建Intent

Intent有如下几个属性:

  • Component name 显式意图需要制定意图的目标组件,如果没有指定此项,那么这个意图就是隐式的,系统会根据其他信息寻找意图的目标对象。
  • Action 隐式意图使用此项指定意图的目标组件,但组件不是直接指定的,而是通过常量指定的。
  • Data 指定数据的URL或MIME类型,如隐式启动浏览器时的http地址。
  • Category 对于意图目标的额外分类信息。
  • Extras 一些键值对数据,extras是直接将数据存放在这项里,区分于action。
  • Flags 指导系统如何启动意图目标的一些额外信息。

显式Intent启动Service例子

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

被intent启动的Activity或Service组件,有一个getIntent()方法,可以获得启动本组件的Intent对象,这样我们就能得到放入Intent属性中的数据了。

隐式Intent携带电话号码启动打电话程序例子

Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);

接收隐式意图

intent-filter定义在应用的manifest中。

示例:

<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>

只要action,category,data全部和intent-filter匹配,intent就能找到这个组件。intent-filter可以指定多个。

一个社交应用示例:

<activity android:name="MainActivity">
    <!-- 程序入口点 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- 这个Activity处理SEND意图,接收文本信息 -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- 这个Activity处理SEND意图,但是接收的是图片和视频 -->
    <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>

一些常用的隐式意图

我们不需要记很多关于隐式意图的配置,用到时直接看看文档就行了:

https://developer.android.google.cn/guide/components/intents-common.html

发送广播

Android中可以使用sendBroadcast()进行发布广播,广播会被BroadcastReciever接收或者没人接收。广播通常用于拦截系统的一些事件,如电量改变,发送短信等。有关广播的内容将在BroadcastReceiver章节中介绍。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap