Intent和Intent过滤器

Intents and Intent Filters

Intent是一个用来起一个App组件启动其他零件的信对象。那里来3栽为主的用法:

  • 启动activity:
    传递Intent,使用startActivity()或者startActivityForResult(),后者可以传结果。
  • 启动service:
    传递Intent,使用startService(Service)()启动一个没有用户界面的service,如若service被规划啊C/S结构,可以采取bind瑟维斯(Service)()绑定一个service。
  • 传送broadcast:
    能够向任何app传递音信通过Intent对象下send布罗德cast()、
    sendOrdered布罗德cast()或sendSticky布罗德(Broad)cast()。

Intent类型

  • 显式Intent
    显式的Intent类型就是当起步之时段指定组件的种,这一个貌似适用于自己之App。
  • 隐式Intent
    隐式的Intent类型一般是凭借指明action,然后传入Intent,适用于非己App。

当您成立一个隐式的Intent对象,安卓系统会通过Intent过滤器查找manifest文件寻找合适的App打开的。如果博使还暴发action,那么会起一个会话框,让用户挑选想要之程序。

下这张图展现了一个Activity如何通过Intent来打开此外一个Activity。

Intent

注意:为了保证你的app的安全性,请直接下显式的Intent来拉开一个service,并且不要打开Intent过滤器,因为通过过滤器打开service不克确保启动者的地点。

确立一个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:
URI对象可以当MIME类型的数额。数据的品种由Intent的Action决定,例如,虽然动作是ACTION_EDIT
,数据应涵盖编辑文档的URI。

装Data
URI需要调用setData()函数,即使只设置MIME类型,则需要调用setType()函数,假设来必不可少,你得又装两者通过调用setDataAndType()函数(这种景色下setData()、setType()函数将不起功能)。

Category:这个内容包含了附加的音讯,这多少个信需要下一个零部件处理相关的信息,不是必不可少的。这儿有一对例子:

CATEGORY_BROWSABLE
目的Activity允许我通过web浏览器来显示由链接诸如图像或电子邮件信息被引用的数码来启动。

CATEGORY_LAUNCHER
这一个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);
}

此例子分享了部分字信息。

强制行使App选拔器

奇迹要不直接打开默认使用,而是每一回都求用户挑选打开的app,这好创立一个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

用接纳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>

眼看是一个多意图的过滤器。第一单Activity,MainActivity,是app的要进口,通过点击图标进入,这么些是出于”android.intent.action.MAIN”决定的。
“android.intent.category.LAUNCHER”决定以此Activity是以系统app启动器中启动的。假如没有点名icon属性,则图标为默认。

仲单Activity,ShareActivity,为了有利于共享文本和传媒内容,可以通过ShareActivity从其他app中跻身,当然要经过滤器。

使您想惟有自己看自己的过滤器而不是被其他app访问的语,可以设置exported属性为false。

使用Pending Intent

pending
Intent是Intent的平栽包装,首要的目的是用权限授予其他程序申请接纳带有的Intent,就像执行好之主次一样。紧要的用处包括:

  • 表达一个Intent,当用户平台接受到你的通后举办。
  • 表一个Intent,当用户以widget时举办。
  • 表达一个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解决方案

当系统接到到一个隐式的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>

Intent匹配

queryIntentActivities()可以回这么些组件可以领你的Intent,具体要查看这里


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

相关文章