来自 APP下载 2019-10-17 17:58 的文章
当前位置: 新萄京娱乐手机版 > APP下载 > 正文

安卓开发指南

Intents and Intent Filters

Intent是一个用来从贰个App组件运维其余零件的音信对象。这里有3种为主的用法:

  • 开行activity: 传递Intent,使用startActivity()或许startActivityForResult(),后面一个能够流传结果。
  • 开行service: 传递Intent,使用startService()运维多少个尚未客户分界面包车型地铁service,假使service被规划为C/S结构,能够行使bind瑟维斯()绑定一个service。
  • 传递broadcast: 能够向此外app传递新闻通过Intent对象使用send布罗兹cast()、 sendOrdered布罗兹cast()或sendSticky布Rhodescast()。

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: URAV4I对象能够作为MIME类型的多寡。数据的项目由Intent的Action决定,举个例子,如若动作是ACTION_EDIT ,数据应包涵编辑文书档案的U中华VI。

安装Data U帕杰罗I需求调用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的尤为重要输入,通过点击Logo步入,这一个是由"android.intent.action.MAIN"决定的。 "android.intent.category.LAUNCHECR-V"决定以此Activity是在系统app运转器中运营的。若无一点点名icon属性,则Logo为私下认可。

其次个Activity,ShareActivity,为了有助于共享文本和媒体内容,能够通过ShareActivity从此外app中跻身,当然须求经过过滤器。

倘诺您想独有和睦拜望本人的过滤器实际不是让其他app访谈的话,能够设置exported属性为false。

使用Pending Intent

pending Intent是Intent的一种包装,首要的目标是将权限授予别的程序提请使用带有的Intent,就好像实行自身的次序一样。主要的用途包蕴:

  • 说美素佳儿(Friso)个Intent,当客商平台接受到您的通报后施行。
  • 说美赞臣个Intent,当顾客使用widget时举办。
  • 说圣元(Nutrilon)个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:每一日写一篇认为好累啊……

本文由新萄京娱乐手机版发布于APP下载,转载请注明出处:安卓开发指南

关键词: