Intent和Intent过滤器

Intents and Intent Filters

Intent是一个所以来打一个App组件启动其他零件的音信对象。这里有3种基本的用法:

  • 启航activity:
    传递Intent,使用startActivity()或者startActivityForResult(),后者可以流传结果。
  • 启动service:
    传递Intent,使用startService()启动一个没用户界面的service,假使service被规划吧C/S结构,可以用bind瑟维斯(Service)()绑定一个service。
  • 传递broadcast:
    可以于其他app传递新闻通过Intent对象下send布罗德(Broad)cast()、
    sendOrdered布罗德cast()或sendSticky布罗德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:每一日写一首感觉好艰巨呀……

相关文章