Intents and Intent Filters全解析
来源:互联网 发布:蓝色降落伞 知乎 编辑:程序博客网 时间:2024/06/15 20:01
官网地址:http://developer.android.com/guide/components/intents-filters.html
一个Intent(意图)是一个消息对象,您可以使用它从另一个应用程序组件(Activity、Service、Content Provider、Broadcast Receiver)启动一个Action。尽管Intent很方便在几个组件之间通信,但它常用的基本使用场景有三个:
- 启动一个Activity
如果你想当Activity finish时获得Activity返回的数据,可以在当前Activity调用startActivityForResult(),然后在onActivityResult()回调方法中处理Intent返回的数据。
- 启动一个服务
如果Service作为客户端-服务器的接口,可以通过bindService()来绑定一个Service。
- 发送一个广播
Intent类型
显式意图(Explicit intents)
通过完整的类型启动一个组件。在你的App中,你可以通过显式intent来启动一个组件,因为你知道组件的完整类名。
隐式意图(Implicit intents)
注意:为了确保你的应用程序安全,在启动Service时请务必使用显式Intent,并且不要为Service声明任何的IntentFilter。使用隐式Intent启动Service是一种安全风险,因为你不能确定哪个Service将响应Intent,用户也不能看到哪个Service启动了。在Android 5(API Level 21)开始,如果你使用隐式Intent调用bindservice()系统会抛出一个异常。
创建一个Intent
一个Intent对象携带的信息确定哪些组件启动(如确切的组件名称或组件类别(category )),加上通过Intent接受到的信息,以便能正确执行这个action(如设置action和data)。
Component name
Action
ACTION_VIEW
ACTION_SEND
Data
仅设置data的URI,使用setData();仅设置MIME类型,调用setType(),如果需要的话,可以一起设置setDataAndType()
Category
CATEGORY_BROWSABLE
CATEGORY_LAUNCHER
然而,intent还可以附带一些信息,这些信息不会影响组件的特征。intent可以提供:
Extras
Flags
显式Intent的例子
// 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);
Intent(Context, Class) 构造方法提供了Context参数和Class参数,因此,这个显式intent在app中启动了DownloadService
隐式Intent的例子
// Create the text message with a stringIntent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);sendIntent.setType("text/plain");// Verify that the intent will resolve to an activityif (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent);}
调用startactivity(),系统检查所有的安装的应用程序,以确定哪些可以处理这种意图(Intent的ACTION_SEND的action,处理“text/plain”数据)。如果只有一个应用程序可以处理它,该应用程序立即打开。如果多个Activity可以处理这个意图,系统则显示一个对话框,让用户可以选择使用哪个应用程序。
强制使用App选择框
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 dialogIntent chooser = Intent.createChooser(sendIntent, title);// Verify the original intent will resolve to at least one activityif (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser);}这个例子用createChooser()方式创建intent,并提供了一个chooser_title作为对话框的标题,对话框中将显示多个app供用户选择。
接收一个隐式Intent
为让你的app能接收一个隐式Intent,需要在manifest文件中你的app节点下声明一个或多个 <intent-filter>元素。每一个intent-filter中基于action, data和category指定了可以接受的intent类型。当intent满足intent-filter的条件时系统将发送一个隐式intent给你的app组件。
在manifest文件中每个intent filter 由一个<intent-filter>元素定义,并嵌套在对应的App组件(如一个<Activity>元素)中。在<intent-filter>中,你可以使用这三个元素(action,data,category)的一种或多种来指定Intent的类型
<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>, <data>或 <category>元素。如果创建了多个,则可以处理intent-filter中定义的多个intent。所以,要响应多个intent,创建多个action,data,category即可。
过滤器的例子
<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>
使用Pending Intent
声明一个intent在未来某个时候当用户点击了Notification才被执行(NotificationManager执行Intent)
声明一个intent在未来某个时候用户操作App Widget再执行(桌面屏幕app执行Intent)
声明一个intent在未来某个特定时间执行(Android系统的AlarmManager执行Intent)
由于每个声明的intent是用来处理某个特定的组件(Activity, Service, 或BroadcastReceiver),所以创建PendingIntnet也要基于一样的考虑。当使用PendingIntent,你的app不会通过调用startActivity()马上执行。当你创建PengdingIntent你必须声明即将要执行的组件:
PendingIntent.getActivity()创建 启动Activity的Intent.
PendingIntent.getService() 创建 启动Service的Intent.
PendingIntent.getBroadcast() 创建 启动 BroadcastReceiver的Intent.
Intent解决方案
接下来的部分将描述对于manifest文件中声明的intent-filter而言intent是如何匹配到最合适的组件的。
action测试
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ...</intent-filter>
Category测试
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ...</intent-filter>
Data测试
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ...</intent-filter>
Each <data>
element can specify a URI structure and a data type (MIME media type). There are separate attributes — scheme
, host
, port
, and path
— for each part of the URI:
<scheme>://<host>:<port>/<path>
如果没有指定schema,host被忽略
如果没有指定host,port被忽略
如果schema和host都没指定,path被忽略。
intent匹配
你的应用可以使用类似的方法进行intent的匹配。PackageManager 有一系列的query...()方法,它会返回所有接收特殊intent的组件,类似的,还有一系列resolve...()方法,用于决定哪一个组件最适合来响应intent,例如queryIntentActivities()通过参数返回一个activity的集合,同样queryIntentServices()返回service的集合。这几个方法都不会激活组件,他们只是列出他们可以响应的组件。对于broadcast receivers,类似的有queryBroadcastReceivers()方法。
- Intents and Intent Filters全解析
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- intents and intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Intents and Intent Filters
- Spring入门实例
- 工作的准备
- 周易六十四卦——坤卦
- 保证数据完整性
- 常用meta汇总
- Intents and Intent Filters全解析
- Android.mk 简介
- iOS学习之路-加法计算器
- [机器学习] UFLDL笔记 - ICA(Independent Component Analysis)(Code)
- 提高篇 第8节-函数的声明、定义和调用
- leetcode第12题——**Integer to Roman
- 解决IllegalStateException: Can not perform this action after onSaveInstanceState
- 遗传算法入门到掌握(一)
- 2016-01-06 diff calculation