「安卓开发指南」——(App组件)Intent和Intent过滤器

Intent类型

  • 显式Intent
    显式的Intent类型便是在起步的时候钦赐组件的项目,这么些貌似适用于本身的App。
  • 隐式Intent
    隐式的Intent类型一般是指指明action,然后传入Intent,适用于非己App。

当你创造四个隐式的Intent对象,安卓系统会通过Intent过滤器查找manifest文件寻找适合的App打开之。假诺过多选用都有action,那么汇合世3个对话框,让用户挑选想要的程序。

上边那张图体现了二个Activity如何通过Intent来开辟别的一个Activity。

Intent

注意:为了保障你的app的安全性,请间接采纳显式的Intent来打开一个service,并且毫不打开Intent过滤器,因为经过过滤器打开service不能够确定保障运转者的身份。

Intent是3个用来从3个App组件运维其余零件的消息对象。这里有3种基本的用法:

收取贰个隐式的Intent

内需接纳intent-filter,前边有说,就不赘述了,直接上例子:

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

那是3个多意图的过滤器。第多个Activity,MainActivity,是app的重中之重进口,通过点击图标进入,这一个是由”android.intent.action.MAIN”决定的。
“android.intent.category.LAUNCHE帕杰罗”决定以此Activity是在系统app运维器中运营的。尽管没有点名icon属性,则图标为暗中认可。

第二个Activity,ShareActivity,为了有利于共享文本和传播媒介内容,能够通过ShareActivity从别的app中进入,当然供给经过过滤器。

比方你想唯有团结走访本身的过滤器而不是让其余app访问的话,能够设置exported属性为false。

使用Pending Intent

pending
Intent是Intent的一种包装,主要的指标是将权力授予其他程序提请选择含有的Intent,就像执行本人的程序一样。首要的用处包含:

  • 表多美滋(Nutrilon)个Intent,当用户平台接受到你的通告后进行。
  • 表美素佳儿个Intent,当用户接纳widget时实施。
  • 表Bellamy个Intent,在现在鲜明的日子内执行。

此间有四个章程:

  1. PendingIntent.getActivity() for an Intent that starts an Activity.
  2. PendingIntent.getService() for an Intent that starts a Service.
  3. PendingIntent.getBroadcast() for a Intent that starts an
    BroadcastReceiver.

实际的pending
Intent官方解释在这儿

Intent匹配

queryIntentActivities()能够重回那多少个组件能够承受你的Intent,具体请查看这里


P.S:每一日写一篇感觉好累啊……

成立一个Intent

Intent对象涵盖了安卓系统决定打开那二个运用的新闻并且带有了有个别传递新闻。Intent对象涵盖了以下内容:

Component name:
要开启的组件的名号。显式Intent所不可不的,假诺没有该项,则为隐式Intent。对于service必须钦赐该项。你能够经过
setComponent(), setClass(),
setClassName()等函数设置该项的内容,比如com.example.ExampleActivity

Action 一个钦赐特定的表现的字符串,比如view、pick。
你能够应用setAction()函数来钦命Intent的Action,也得以透过以艺术自个儿定义action:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";

Data:
U景逸SUVI对象足以看做MIME类型的数目。数据的类型由Intent的Action决定,例如,假如动作是ACTION_EDIT
,数据应涵盖编辑文书档案的U汉兰达I。

设置Data
USportageI供给调用setData()函数,假诺只有设置MIME类型,则供给调用setType()函数,假若有必不可少,你能够同时设置两者通过调用setDataAndType()函数(这种景况下setData()、setType()函数将不起成效)。

Category:那个剧情涵盖了附加的音信,这个音信要求下一个组件处理相关的音信,不是必备的。那儿有一些事例:

CATEGORY_BROWSABLE
指标Activity允许作者通过web浏览器来体现由链接诸如图像或电子邮件音讯中引用的数额来运维。

CATEGORY_LAUNCHE瑞鹰这么些Activity是系统app运维器中的职务栏里运转的Activity。

你能够透过调用addCategory()函数来钦赐category。

Extras:键值对封存的新闻。能够透过putExtra()存入,也能够成立二个Bundle对象保存全部的Extra数据,然后通过putExtras()函数插入到Intent中。

Flags :
Intent类中定义了Flags函数作为元数据。这几个参数能够禁止安卓系统怎样运行activity并且接下去怎么样执行。相关函数为setFlags()

三个事例:

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

以此事例开启了几个下载服务,并将盛传的fileUrl内容下载下来。

再来贰个例子:

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

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

本条例子分享了有个别文字消息。

  • 启航activity:
    传递Intent,使用startActivity()或许startActivityForResult(),后者能够流传结果。
  • 运维service:
    传递Intent,使用startService()运维三个并未用户界面包车型地铁service,假设service被规划为C/S结构,能够应用bindService()绑定3个service。
  • 传递broadcast:
    可以向别的app传递音讯通过Intent对象使用send布罗兹cast()、
    sendOrdered布罗兹cast()或sendStickyBroadcast()。

Intents and Intent Filters

强制行使App选拔器

奇迹要求不直接打开暗许使用,而是每一回都供给用户挑选打开的app,那足以创制3个createChooser()
Intent对象,然后将其传播startActivity(),如下:

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

// Always use string resources for UI text.
// This says something like "Share this photo with"
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消除方案

当系统接到到3个隐式的Intent后,会因而action、data、category决定使用哪个app。

Action test

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

Category test

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

Data test

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>