Android开发之旅_17_Intents和Intent Filters(实例部分)
详解Android应用开发中Intent的作用及使用方法
详解Android应⽤开发中Intent的作⽤及使⽤⽅法Intent是⼀种运⾏时绑定(run-time binding)机制,它能在程序运⾏过程中连接两个不同的组件。
通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。
⽐如,有⼀个Activity希望打开⽹页浏览器查看某⼀⽹页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到⽹页浏览器的Activity来浏览⽹页。
Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent⽅式:要激活⼀个新的Activity,或者让⼀个现有的Activity做新的操作,可以通过调⽤Context.startActivity()或者Activity.startActivityForResult()⽅法。
要启动⼀个新的Service,或者向⼀个已有的Service传递新的指令,调⽤Context.startService()⽅法或者调⽤Context.bindService()⽅法将调⽤此⽅法的上下⽂对象与Service绑定。
Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个⽅法可以发送Broadcast Intent。
发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。
Intent⼀旦发出,Android都会准确找到相匹配的⼀个或多个Activity,Service或者BroadcastReceiver作响应。
Android开发讲义(第五章 Intent与IntentFilter)
跳转的目标类
<activity android:name=".SecondActivity“ android:label="@string/app_name">
<intent-filter>
<action android:name="com.android.action.DEMO_ACTION" />
}
定义Action与Category属性
Android开发讲义
Category属性举例 (配置文件) 示例
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".DemoActivity“ android:label="@string/app_name">
Android开发讲义
Action属性举例 (配置文件) 示例
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".DemoActivity“ android:label="@string/app_name">
}); }
Android开发讲义
使用Intent中的Component属性(目标类) 示例 protected void onCreate(Bundle savedInstanceState) {
IntentFilter
当Intent在组件间传递时,组件如果想告知Android系统自己能够响应和处理哪些Intent,那么就需要用到IntentFilter对象。
顾名思义,IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
IntentFilter实行“白名单”管理,即只列出组件乐意接受的Intent,但IntentFilter只会过滤隐式Intent,显式的Intent会直接传送到目标组件。
Android组件可以有一个或多个IntentFilter,每个IntentFilter之间相互独立,只需要其中一个验证通过则可。
除了用于过滤广播的IntentFilter可以在代码中创建外,其他的IntentFilter必须在AndroidManifest.xml 文件中进行声明。
IntentFilter中具有和Intent对应的用于过滤Action,Data和Category的字段,一个隐式Intent要想被一个组件处理,必须通过这三个环节的检查。
一:检查Action 尽管一个Intent只可以设置一个Action,但一个Intentfilter可以持有一个或多个Action用于过滤,到达的Intent只需要匹配其中一个Action即可。
深入思考:如果一个Intentfilter 没有设置Action的值,那么,任何一个Intent都不会被通过;反之,如果一个Intent对象没有设置Action值,那么它能通过所有的Intentfilter的Action检查。
二:检查Data 同Action一样,Intentfilter中的Data部分也可以是一个或者多个,而且可以没有。
每个Data包含的内容为URL和数据类型,进行Data检查时主要也是对这两点进行比较,比较规则:如果一个Intent对象没有设置Data,只有Intentfilter也没有设置Data时才可通过检查。
Android应用开发从入门到精通
Android应用开发从入门到精通第一章:介绍Android应用开发的基础概念Android应用开发是指基于Android操作系统平台开发的移动应用程序。
Android是一个基于Linux的开放源代码平台,它提供了强大的开发工具和丰富的API(应用程序接口),使开发者能够创建各种各样的应用程序,包括游戏、社交媒体、电子商务和工具类应用等。
Android应用开发的核心概念包括Activity、Fragment、布局文件、资源文件、Intent等。
Activity是Android应用的主要组件,每个Activity代表了应用的一个界面。
Fragment是一个可重用的界面组件,可以在Activity中动态加载和替换。
布局文件定义了Activity或Fragment中的界面元素的排列方式,可以使用XML语言编写。
资源文件包括图片、字符串、颜色等,用于应用的各种资源的管理。
Intent用于在不同的组件之间进行通信和传递数据。
第二章:Android应用开发环境的搭建要进行Android应用开发,需要搭建相应的开发环境。
首先,需要下载并安装Java Development Kit(JDK),然后下载并安装Android Studio,它是官方推荐的Android开发工具。
安装完Android Studio后,需要配置Android SDK(软件开发工具包)。
Android SDK包含了众多的开发工具和API,可以满足不同应用的需求。
配置SDK的过程通常包括选择需要安装的组件和设置相应的环境变量。
安装完成后,就可以开始进行Android应用的开发了。
第三章:Android应用的UI设计用户界面(UI)是Android应用的重要组成部分,好的UI设计能够提高用户体验。
Android提供了丰富的UI元素和布局管理器,开发者可以根据应用的需求自由选择和设计UI。
常用的UI元素包括文本框、按钮、图像视图、列表视图等。
Android提供了一套用于绘制和交互的UI组件,开发者可以通过XML文件或者代码方式来创建UI界面。
Android_Intent和Intent_Filter详解
Android Intent和Intent Filter详解(一)Intents and Intent FiltersIntent Objects Intent对象Intent Resolution Intent解析Intent filtersFilters and security Filter和安全Common cases 常见情况Using intent matching 使用intent匹配Note Pad Example 例子:记事本Intents and Intent Filters三种应用程序基本组件——activity, service和broadcast receiver——是使用称为intent的消息来激活的。
Intent消息传递是一种组件间运行时绑定的机制. intent是Intent 对象, 它包含了需要做的操作的描述, 或者, 对于广播来说, 包含了正在通知的消息内容. 对于向这三种组件发送intent有不同的机制:使用Context.startActivity() 或 Activity.startActivityForResult(), 传入一个intent来启动一个activity. 使用 Activity.setResult(), 传入一个intent来从activity 中返回结果.将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service. 将intent对象传给 Context.bindService()来绑定一个service.将intent对象传给 Context.sendBroadcast(), Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver.在上述三种情况下, android系统会自己找到合适的activity, service, 或者broadcast receivers来响应intent. 三者的intent相互独立互不干扰.Intent Objects Intent对象一个intent对象包含了接受该intent的组件的信息(例如需要的动作和该动作需要的数据)和android系统所需要的信息. 具体的说:组件名称为一个ComponentName 对象. 它是目标组件的完整名(例如"com.example.project.app.FreneticActivity")和应用程序manifest文件设定的包名(例如"com.example.project")的组合.前者的包名部分和后者不一定一样.组件名称是可选的. 如果设定了的话, Intent对象会被传给指定的类的一个实例. 如果不设定, 则android使用其它信息来定位合适的目标.组件名称是使用setComponent(), setClass(),或setClassName()来设定, 使用getComponent()来获取.Action一个字符串, 为请求的动作命名, 或者, 对于broadcast intent, 发生的并且正在被报告的动作. 例如:你也可以定义自己的action字符串用来启动你的应用程序. 自定义的action应该包含应用程序的包名.例如"com.example.project.SHOW_COLOR".action很大程度上决定了intent的另外部分的结构, 就像一个方法名决定了它接受的参数和返回值一样. 因此, 最好给action一个最能反映其作用的名字.一个intent对象中的action是使用getAction()和setAction()来读写的.Android Intent和Intent Filter详解(二)Data需要操作的数据的URI和它的MIME(多用途互联网邮件扩展,Multipurpose Internet Mail Extensions)类型. 例如, 如果action为ACTION_EDIT, 那么Data将包含待编辑的数据URI. 如果action为ACTION_CALL, Data将为tel:电话号码的URI. 如果action为ACTION_VIEW, 则Data为http:网络地址的URI.当将一个intent和一个组件相匹配时, 除了URI外数据类型也很重要. 例如, 一个显示图片的程序不应该用来处理声音文件.数据类型常常可以从URI推断, 特别是content:URI, 它表示该数据属于一个content provider. 但数据类型也可以被intent对象显示声明. setData()方法设置URI, 而setType()方法指定MIME类型, setDataAndType()设置数据URI和MIME类型. 它们可以使用getData()和getType()来读取.Category一个字符串,包含了关于处理该intent的组件的种类的信息. 一个intent对象可以有任意个category. intent类定义了许多category常数, 例如:addCategory()方法为一个intent对象增加一个category, removeCategory删除一个category, getCategories()获取intent所有的category.Extras为键值对形式的附加信息. 例如ACTION_TIMEZONE_CHANGED的intent有一个"time-zone"附加信息来指明新的时区, 而ACTION_HEADSET_PLUG有一个"state"附加信息来指示耳机是被插入还是被拔出.intent对象有一系列put...()和set...()方法来设定和获取附加信息. 这些方法和Bundle对象很像. 事实上附加信息可以使用putExtras()和getExtras()作为Bundle来读和写.Flags各种标志. 很多标志指示android系统如何启动一个activity(例如该activity属于哪个任务)和启动后如何处理它(例如, 它是否属于最近activity列表中).android系统和应用程序使用intent对象来送出系统广播和激活系统定义的组件.Intent Resolution Intent解析intent有两种:显式intent使用名字来指定目标组件. 由于组件名称一般不会被其它开发者所熟知, 这种intent一般用于应用程序内部消息-- 例如一个activity启动一个附属的service或者另一个activity.隐式intent不指定目标的名称. 一般用于启动其它应用程序的组件.Android将显式intent发送给指定的类. intent对象中名字唯一决定接受intent的对象.对于隐式intent, android系统必须找到最合适的组件来处理它. 它比较intent的内容和intent filter. intent filter是组件的一个相关结构, 表示其接受intent的能力. android 系统根据intent filter打开可以接受intent的组件. 如果一个组件没有intent filter, 那么它只能接受显式intent. 如果有, 则能同时接受二者.当一个intent和intent filter比较时, 只考虑三个属性: action, data, category.extra和flag在intent解析中没有用.Intent filtersactivity, service和broadcast receiver可以有多个intent filter来告知系统它们能接受什么样的隐式intent. intent filter的名字很形象: 它过滤掉不想接受的intent, 留下想接受的intent. 显式intent无视intent filter.一个组件对能做的每件事有单独的filter. 例如, 记事本程序的NoteEditor activity有两个filter -- 一个启动并显示一个特定的记录给用户查看或编辑, 另一个启动一个空的记录给用户编辑.Filters and security Filter和安全一个intent filter不一定安全可靠. 一个应用程序可以让它的某个组件去接受隐式intent, 但是它没法防止这个组件接受显示intent. 其它的程序总是可以使用自定义的数据加上显式的程序名称来调用该组件.一个intent filter是IntentFilter类的实例, 但是它一般不出现在代码中,而是出现在android Manifest文件中, 以<intent-filter>的形式. (有一个例外是broadcast receiver的intent filter是使用 Context.registerReceiver()来动态设定的, 其intent filter也是在代码中创建的.)一个filter有action, data, category等字段. 一个隐式intent为了能被某个intent filter接受, 必须通过3个测试. 一个intent为了被某个组件接受, 则必须通过它所有的intent filter中的一个.Action 测试java代码:1.<intent-filter >2.<action android:name="com.example.project.SHOW_CURRENT" />3.<action android:name="com.example.project.SHOW_RECENT" />4.<action android:name="com.example.project.SHOW_PENDING" />5.. . .6.</intent-filter>复制代码Android Intent和Intent Filter详解(三)一个intent对象只能指定一个action, 而一个intent filter可以指定多个action. action 列表不能为空, 否则它将组织所有的intent.一个intent对象的action必须和intent filter中的某一个action匹配, 才能通过.如果intent filter的action列表为空, 则不通过.如果intent对象不指定action, 并且intent filter的action列表不为空, 则通过.Category 测试java代码:1.<intent-filter >2.<category android:name="android.intent.category.DEFAULT" />3.<category android:name="android.intent.category.BROWSABLE" />4.</intent-filter>复制代码注意前面说到的对于action和category的常数是在代码中用的,而不是manifest文件中用的. 例如, CATEGORY_BROWSABLE常数对应xml中的表示为"android.intent.category.BROWSABLE".一个intent要通过category测试, 那么该intent对象中的每个category都必须和filter中的某一个匹配.理论上来说, 一个intent对象如果没有指定category的话, 它应该能通过任意的category 测试. 有一个例外: android把所有的传给startActivity()的隐式intent看做至少有一个category: "android.intent.category.DEFAULT". 因此, 想要接受隐式intent的activity必须在intent filter中加入"android.intent.category.DEFAULT".Data testjava代码:1.<intent-filter . . . >2.<data android:mimeType="video/mpeg" android:scheme="http" . . . />3.<data android:mimeType="audio/mpeg" android:scheme="http" . . . />4.. . .5.</intent-filter>复制代码每个<data>元素指定了一个URI和一个数据类型. URI每个部分为不同的属性 -- scheme, host, port, path:scheme://host:port/path例如, 在如下的URI中:content://com.example.project:200/folder/subfolder/etc scheme为"content", host为"com.example.project", port为"200", path为"folder/subfolder/etc". host和port一起组成了URI authority. 如果host未指定,则port 被忽略.这些属性都是可选的,但它们并非相互独立: 要使一个authority有意义,必须指定一个scheme. 要使一个path有意义, 必须指定一个scheme和一个authority.当intent对象中的URI和intent filter中相比较时, 它只和filter中定义了的部分比较. 例如, 如果filter中之定义了scheme,那么所有包含该scheme的URI的intent对象都通过测试.对于path来说,可以使用通配符来进行部分匹配.<data>元素的type属性指定了数据类型. 它在filter中比在URI中更常见. intent对象和filter都可以使用"*"通配符作为子类型. 例如"text/*" "audio/*"表示所有的子类型都匹配.data测试的规则如下:一个不含uri也不含数据类型的intent对象只通过两者都不包含的filter.一个含uri但不含数据类型的intent对象(并且不能从uri推断数据类型的)只能通过这样的filter: uri匹配, 并且不指定类型. 这种情况限于类似mailto:和tel:这样的不指定实际数据的uri.一个只包含数据类型但不包含URI的intent只通过这样的filter: 该filter只列出相同的数据类型, 并且不指定uri.一个既包含uri又包含数据类型的intent对象只通过这样的filter: intent对象的数据类型和filter中的一个类型匹配, intent对象的uri要么和filter的uri匹配, 要么intent 对象的uri为content:或者file:, 并且filter不指定uri.如果一个intent可以通过多于一个activity或者service的filter, 那么用户可能会被询问需要启动哪一个. 如果一个都没有的话, 那么会抛出异常.Common cases 常见情况上述的最后一个规则(d)说明了组件通常可以从文件和content provider中获取数据. 因此, 它们的filter可以只列出数据类型不列scheme. 这是个特殊情况. 下列<data>元素告诉android该组件可以从一个content provider取得图像数据并显示之:java代码:1.<data android:mimeType="image/*" />复制代码由于大部分可用的数据由content provider提供, 指定数据类型但不指定uri的filter 是最常见的情况.另外一个常见的配置是filter具有一个scheme和一个数据类型. 例如, 下列<data>元素告诉android该component可以从网络获取图像数据并显示之:java代码:1.<data android:scheme="http" android:type="video/*" />复制代码考虑用户点击一个网页时浏览器的动作. 它首先试图显示这个数据(当做一个html页来处理). 如果无法显示, 则创建一个隐式intent, 并启动一个可以处理它的activity. 如果没有这样的activity, 那么它请求下载管理器来下载该数据. 然后它将数据置于一个content provider的控制之下, 这样有很多activity(拥有只有数据类型的filter)可以处理这些数据.大部分应用程序还有一种方法来单独启动, 不需要引用任何特定的数据. 这些能启动应用程序的activity具有action为"android.intent.action.MAIN" 的filter. 如果它们需要在应用程序启动器中显示, 它们必须指定"UNCHER" 的category.java代码:1.<intent-filter . . . >2.<action android:name="code android.intent.action.MAIN" />3.<category android:name="code UNCHER" />4.</intent-filter>复制代码Android Intent和Intent Filter详解(四)Using intent matching 使用intent匹配intent和intent filter相匹配, 不仅为了寻找并启动一个目标组件, 也是为了寻找设备上组件的信息. 例如, android系统启动了应用程序启动器, 该程序位于屏幕的顶层, 显示了用户可以启动的程序, 这是通过查找设备上所有的action为"android.intent.action.MAIN" ,category为"UNCHER"的intent filter所在的activity实现的. 然后它显示了这些activity的图标和标题. 类似的, 它通过寻找 "android.intent.category.HOME"的filter来定位主屏幕程序.应用程序可以用相同的方式来使用intent匹配. PackageManager 有一组query...()方法来寻找接受某个特定intent的所有组件, 还有一系列resolve...()方法来决定响应一个intent的最佳组件. 例如, queryIntentActivities()返回一个activity列表, 这些activity 可以执行传入的intent. 类似的还有queryIntentServices()和queryIntentBroadcastReceivers().Note Pad Example 例子:记事本记事本示例程序让用户可以浏览一个笔记列表, 查看, 编辑, 删除和增加笔记. 这一节关注该程序定义的intent filter.在其manifest文件中, 记事本程序定义了三个activity, 每个有至少一个intent filter. 它还定义了一个content provider来管理笔记数据. manifest 文件如下:java代码:1.<manifest xmlns:android="/apk/res/android"2.package="eoe.demo">3.<application android:icon="@drawable/app_notes"4.android:label="@string/app_name" >5.6.<provider android:name="NotePadProvider"7.android:authorities="com.google.provider.NotePad" />8.9.<activity android:name="NotesList"android:label="@string/title_notes_list">10.<intent-filter>11.<action android:name="android.intent.action.MAIN" />12.<category android:name="UNCHER" />13.</intent-filter>14.<intent-filter>15.<action android:name="android.intent.action.VIEW" />16.<action android:name="android.intent.action.EDIT" />17.<action android:name="android.intent.action.PICK" />18.<category android:name="android.intent.category.DEFAULT" />19.<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />20.</intent-filter>21.<intent-filter>22.<action android:name="android.intent.action.GET_CONTENT" />23.<category android:name="android.intent.category.DEFAULT" />24.<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />25.</intent-filter>26.</activity>27.28.<activity android:name="NoteEditor"29.android:theme="@android:style/Theme.Light"30.android:label="@string/title_note" >31.<intent-filter android:label="@string/resolve_edit">32.<action android:name="android.intent.action.VIEW" />33.<action android:name="android.intent.action.EDIT" />34.<action android:name="com.android.notepad.action.EDIT_NOTE" />35.<category android:name="android.intent.category.DEFAULT" />36.<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />37.</intent-filter>38.<intent-filter>39.<action android:name="android.intent.action.INSERT" />40.<category android:name="android.intent.category.DEFAULT" />41.<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />42.</intent-filter>43.</activity>44.45.<activity android:name="TitleEditor"46.android:label="@string/title_edit_title"47.android:theme="@android:style/Theme.Dialog">48.<intent-filter android:label="@string/resolve_title">49.<action android:name="com.android.notepad.action.EDIT_TITLE" />50.<category android:name="android.intent.category.DEFAULT" />51.<category android:name="android.intent.category.ALTERNATIVE" />52.<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />53.<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />54.</intent-filter>55.</activity>56.</application>57.</manifest>复制代码第一个activity, NoteList, 和其它activity不同, 因为它操作一个笔记的目录(笔记列表), 而不是一个单独的笔记. 它一般作为该程序的初始界面. 它可以做以下三件事:java代码:1.<intent-filter>2.<action android:name="android.intent.action.MAIN" />3.<category android:name="UNCHER" />4.</intent-filter>复制代码该filter声明了记事本应用程序的主入口. 标准的MAIN action是一个不需要任何其它信息(例如数据等)的程序入口, LAUNCHER category表示该入口应该在应用程序启动器中列出.java代码:1.<intent-filter>2.<action android:name="android.intent.action.VIEW" />3.<action android:name="android.intent.action.EDIT" />4.<action android:name="android.intent.action.PICK" />5.<category android:name="android.intent.category.DEFAULT" />6.<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />7.</intent-filter>复制代码Android Intent和Intent Filter详解(五)该filter声明了改activity可以对一个笔记目录做的事情. 它允许用户查看或编辑该目录(使用VIEW和EDIT action), 或者选取特定的笔记(使用PICK action).<data>元素的mimeType指定了这些action可以操作的数据类型. 它表明该activity 可以从一个持有记事本数据的content provider(vnd.google.note)取得一个或多个数据项的Cursor(vnd.android.cursor.dir).注意该filter提供了一个DEFAULT category. 这是因为Context.startActivity() 和 Activity.startActivityForResult()方法将所有的intent 都作为作为包含了DEFAULT category来处理, 只有两个例外:显式指明目标activity名称的intent.包含MAIN action 和LAUNCHER category的intent.因此, 除了MAIN和LAUNCHER的filter之外, DEFAULT category是必须的.java代码:1.<intent-filter>2.<action android:name="android.intent.action.GET_CONTENT" />3.<category android:name="android.intent.category.DEFAULT" />4.<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />5.</intent-filter>复制代码这个filter描述了该activity能够在不需要知道目录的情况下返回用户选择的一个笔记的能力. GET_CONTENT action和PICK action相类似. 在这两者中, activity都返回用户选择的笔记的URI. (返回给调用startActivityForResult()来启动NoteList activity的activity.) 在这里, 调用者指定了用户选择的数据类型而不是数据的目录.这个数据类型, vnd.android.cursor.item/vnd.google.note, 表示了该activity 可以返回的数据类型 -- 一个笔记的URI. 从返回的URI, 调用者可以从持有笔记数据的content provider(vnd.google.note)得到一个项目(vnd.android.cursor.item)的Cursor.也就是说, 对于PICK来说, 数据类型表示activity可以给用户显式的数据类型.对于GET_CONTENT filter, 它表示activity可以返回给调用者的数据类型.下列intent可以被NoteList activity接受:action: android.intent.action.MAIN不指定任何数据直接启动activity.action: android.intent.action.MAINcategory: UNCHER不指定任何数据直接启动activity. 这是程序启动器使用的intent. 所有使用该组合的filter的activity被加到启动器中.action: android.intent.action.VIEWdata: content://com.google.provider.NotePad/notes要求activity显示一个笔记列表,这个列表位于content://com.google.provider.NotePad/notes. 用户可以浏览这个列表并获取列表项的信息.action: android.intent.action.PICKdata: content://com.google.provider.NotePad/notes请求activity显示content://com.google.provider.NotePad/notes下的笔记列表. 用户可以选取一个笔记, activity将返回笔记的URI给启动NoteList的activity.action: android.intent.action.GET_CONTENTdata type: vnd.android.cursor.item/vnd.google.note请求activity提供记事本数据的一项.第二个activity, NoteEditor, 为用户显示一个笔记并允许他们编辑它. 它可以做以下两件事:java代码:1.<intent-filter android:label="@string/resolve_edit">2.<action android:name="android.intent.action.VIEW" />3.<action android:name="android.intent.action.EDIT" />4.<action android:name="com.android.notepad.action.EDIT_NOTE" />5.<category android:name="android.intent.category.DEFAULT" />6.<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />7.</intent-filter>复制代码这个activity的主要目的是使用户编辑一个笔记--VIEW或者EDIT一个笔记. (在category中,EDIT_NOTE是EDIT的同义词.) intent包含匹配MIME类型vnd.android.cursor.item/vnd.google.note的URI--也就是某一个特定的笔记的URI. 它一般来说是NoteList activity中的PICK或者GET_CONTENT action返回的.像以前一样,该filter列出了DEFAULT category.java代码:1.<intent-filter>2.<action android:name="android.intent.action.INSERT" />3.<category android:name="android.intent.category.DEFAULT" />4.<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />5.</intent-filter>复制代码该activity的第二个目的是使用户能够创建一个新的笔记, 并插入到已存在的笔记目录中. 该intent包含了匹配vnd.android.cursor.dir/vnd.google.note的URI, 也就是笔有了这些能力, NoteEditor就可以接受以下intent:action: android.intent.action.VIEWdata: content://com.google.provider.NotePad/notes/ID要求activity显示给定ID的笔记.action: android.intent.action.EDITdata: content://com.google.provider.NotePad/notes/ID要求activity显示指定ID的笔记,然后让用户来编辑它. 如果用户保存了更改,则activity更新该content provider的数据.action: android.intent.action.INSERTdata: content://com.google.provider.NotePad/notes要求activity创建一个新的空笔记在content://com.google.provider.NotePad/notes, 并允许用户编辑它, 如果用户保存了更改,则该URI被返回给调用者.最后一个activity, TitleEditor, 允许用户编辑笔记的标题. 这可以通过直接调用activity(在intent中设置组件名称)的方式来实现. 但是这里我们用这个机会来展示如何在已有数据上进行另外的操作java代码:1.<intent-filter android:label="@string/resolve_title">2.<action android:name="com.android.notepad.action.EDIT_TITLE" />3.<category android:name="android.intent.category.DEFAULT" />4.<category android:name="android.intent.category.ALTERNATIVE" />5.<categoryandroid:name="android.intent.category.SELECTED_ALTERNATIVE" />6.<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />7.</intent-filter>复制代码系列之Android Intent和Intent Filter详解(一)的帖子链接/thread-83566-1-1.html系列之Android Intent和Intent Filter详解(二)的帖子链接/thread-83568-1-1.html系列之Android Intent和Intent Filter详解(三)的帖子链接/thread-83573-1-1.html系列之Android Intent和Intent Filter详解(四)的帖子链接/thread-83574-1-1.html。
16_Intents和Intent Filters(理论部分)
Intents和Intent Filters(理论部分)Intents和Intent Filters(理论部分 ) (2)引言 (2)1 、概述 (2)2 、 Intent对象 (3)2.1 、组件名字 (3)2.2 、动作 (3)2.3 、数据 (4)2.4 、种类 (5)2.5 、附加信息 (5)2.6 、标志 (6)3 、 Intent解析 (6)3.1 、 Intent过滤器 (6)3.1.1 、动作检测 (7)3.1.2 、种类检测 (7)3.1.3 、数据检测 (8)3.2 、通用情况 (9)3.3 、使用intent匹配 (9)Intents和Intent Filters(理论部分)引言大部分移动设备平台上的应用程序都运行在他们自己的沙盒中。
他们彼此之间互相隔离, 并且严格限制应用程序与硬件和原始组件之间的交互。
我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义!Android应用程序也是一个沙盒,但是他们能够使用Intent、 BroadcastReceivers、Adapters、Content Providers、Internet去突破他们的边界互相交流。
有交流还会和谐,由此可见这些交流手段有多重要。
上篇文章中我们在 SMS接收程序和使用Intent发送SMS程序中用到了Intent,并做了简单的回顾和总结:android应用程序的三大组件—— Activities、Services、Broadcast Receiver,通过消息触发,这个消息就称作意图(Intent)。
然后以活动为例简单介绍了Intent了并说明Intent机制的好处。
既然在 SMS程序中用到了Intent,这里我就借机顺着这条线,彻底详细地介绍一下Intent。
分两篇文章介绍:1.Android开发之旅: Intents和Intent Filters(理论部分)2.Android开发之旅: Intents和Intent Filters(实例部分)本文的主要内容如下:•1、概述•2、Intent对象• 2.1、组件名字• 2.2、动作• 2.3、数据• 2.4、种类• 2.5、附加信息• 2.6、标志•3、Intent解析• 3.1、Intent过滤器• 3.1.1、动作检测• 3.1.2、种类检测• 3.1.3、数据检测• 3.2、通用情况• 3.3、使用intent匹配1、概述一个应用程序的三个核心组件——activities、services、broadcast receivers,都是通过叫做intents的消息激活。
简述IntentFilter(意图过滤器)
简述IntentFilter(意图过滤器)1.什么是IntentFilter ?IntentFilter翻译成中⽂就是“意图过滤器”,主要⽤来过滤隐式意图。
当⽤户进⾏⼀项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以响应该操作的组件,服务。
例如:当⽤户点击PDF⽂件的时候,Android系统就会通过设定好的意图过滤器,进⾏匹配测试。
找到能够打开PDF⽂件的APP程序。
代码:<activity android:name="com.example.testmain.ShowActivity" ><intent-filter><action android:name="test.update.mydata" /><category android:name="my.test.show" /><data android:pathPattern=".*\\.jpg" android:scheme="http" /></intent-filter></activity>2.IntentFilter 如何过滤隐式意图?Android系统会根据我们配置的Intent Filter(意图过滤器),来进⾏匹配测试。
匹配的时候,只会考虑三个⽅⾯:动作、数据(URI以及数据类型)和类别。
也就是说Android系统会进⾏“动作测试”,“数据测试”,“类别测试”,来寻找可以响应隐式意图的组件或服务。
另外,当对其他App程序开放组件和服务的时候也需要配置Intent Filter(意图过滤器),⼀个Activity可以配置多个<intent-filter>。
3.动作测试:对应<intent-filter>中的<action/>标签;(1) 如果<intent-filter>标签中有多个<action/>,那么Intent请求的Action,只要匹配其中的⼀条<action/>就可以通过了这条<intent-filter>的动作测试。
androidIntent和IntentFilter
androidIntent和IntentFilterandroid的应⽤程序包含三种重要的组件:Activity、Service、BroadcastReceiver,应⽤程序采⽤⼀致的⽅式来启动他们——都是依靠Intent 来进⾏启动。
Intent就封装了程序想要启动的程序意图,不仅如此,Intent还可⽤于与被启动组件交换信息。
Intent的属性及intent-filter配置:Intent的Component属性需要接受⼀个ComponentName对象,ComponentName对象包含如下⼏个构造器:1、ComponentName(String pkg, String cls):创建pkg所在包下的cls类对应的组件2、ComponentName(Context pkg, String cls):创建pkg所对应的包下的cls类所对应的组件3、ComponentName(Context pkg, Class<?> cls):创建pkg所对应的包下的cls类所对应的组件上⾯构造器的本质就是⼀个,这说明创建⼀个ComponentName需要指定包名和类名——这就可以唯⼀地确定⼀个组件类,这样应⽤程序即可根据给定的组件类去启动特定的组件。
ComponentName comp = new ComponentName(this, NewActivity.class);Intent intent = new Intent();intent.setComponent(comp);startActivity(intent);上⾯的也可以写成如下的形式:Intent intent = new Intent(this, NewActivity.class);当程序通过Intent的Component属性(明确指定启动那个组件)启动组件时,被启动的组件⼏乎不再需要使⽤<inetnt-filter....../>元素进⾏配置了。
Intents and Intent Filters
Intent Filter
• Intent Filter 描述了一个组件愿意接收什么 样的Intent 对象,Android 将其抽象为 android.content.IntentFilter类。在Android 的 AndroidManifest.xml 配置文件中可以通过 <intent-filter >节点为一个Activity 指定其 Intent Filter,以便告诉系统该Activity 可以 响应什么类型的Intent。
Category
• 类别(category):对执行动作的附加信息进行描述可以在一个Intent对象 中指定任意数量的种类描述。Intent类定义的一些种类常量,如下这 些:(更多的种类常量请参考Intent类。 )
addCategory()方法添加一个种类到Intent对象中,removeCategory()方 法删除一个之前添加的种类,getCategories()方法获取Intent对象中的 所有种类。
一个intent对象的动作通过setAction()方法设置,通过getAction()方法读取。
Data
• data是将作用于其上的数据的URI和数据的MIME类型。不同的动作有 不同的数据规格。例如,如果动作字段是ACTION_EDIT, 数据字段将 包含将显示用于编辑的文档的URI;如果动作是ACTION_CALL,数据字 段将是一个tel:URI和将拨打的号码;如果动作是 ACTION_VIEW,数据 字段是一个http:URI,接收activity将被调用去下载和显示URI指向的数 据。 当匹配一个intent到一个能够处理数据的组件,通常知道数据的类型 (它的MIME类型)和它的URI很重要。例如,一个组件能够显示图像 数据,不应该被调用去播放一个音频文件。
项目7扩:Intenet理解
Android Intents和Intent Filters详解资料来源:/mapdigit/article/details/8709888Android应用中的三个核心组件:Activities,Services和broadcastreceivers都是通过称为“Intent”的消息来激活的。
Android应用一个特点是“低耦合”,各个Activities,Services和broadcastreceivers相当独立,可以看成是一个个“迷你应用”,而Intent是这些“迷你应用”的粘合剂,Intent不但可以用于同一个Application之间Activities,Services和broadcast receivers 的交互,也可以用于不同Application之间Activities,Services和broadcastreceivers的交互。
Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。
用个容易理解的概念,在访问网站时,我们需要提供网站的URL,有时还需要通过URL参数,在Android世界里,Intent的功能类似于URL,Android操作系统根据Intent来触发对于的Activitives,Services或是BroadcastReceivers。
Android应用中的三个核心组件:Activities,Services和broadcastreceivers都是通过Intent 来触发的,当它们触发的机制各不相同,而且不会有重叠,也就是说发给Activity的Intent不会激活Service或是broadcastreceivers,发给broadcastreceivers的Intent也不会触发Activity 和Service。
1. Activity通过方法 Context.startActivity() 和Activity.startActivityForResult()来调用。
AndroidIntent与IntentFilter案例详解
1. 前言在Android中有四组件,这些组件中有三个组件与Intent相关,可见Intent在Android整个生态中的地位高度。
Intent信息的载体,用它可以去请求组件相应的操作,但相对于这个功能,Intent本身的结构更值得们去研究。
2. Intent与组件Intent促进了组件之间的交互,这对于发者非常重要,而且它还能为消息的载体,去指导组件出相应的行为,也就说Intent可以携带数据,传递给Activity/Service/BroadcastReceiver。
启动Activity。
Activity可以简单的理解为屏幕中的一个页面,你可以通过将Intent传入startActivity方法来启动一个Activity的实例,也就一个页面,同时,Intent也可以携带数据,传递给新的Activity。
如果想要获取新建的Activity执行结果,可以通过onActivityResult()方法去启动Activity。
启动Service。
Service一个不呈现交互画面的后台执行操作组件,可以通过将Intent穿入startService()方法来启动一个Service来启动。
传递广播BroadCast。
广播任何应用都可以接收到的消息,通过将Intent传递给sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast()方法,可以将广播传递接收方。
3. Intent类型在Android中,Intent分为两种类型,显式和隐式。
显式Intent,可以通过类名来找到相应的组件,在应用中用显式Intent去启动一个组件,通常因为们知道这个组件(Activity或者Service)的名字。
如下代码,们知道具体的Activity的名字,要启动一个新的Activity,就用的显示Intent。
Intent intent = new Intent(context,XXActivity.class);startActivity(intent);隐式Intent,不指定具体的组件,但它会声明将要执行的操作,从而匹配到相应的组件。
android kotlin filter用法 -回复
android kotlin filter用法-回复过滤器(filter)是Android Kotlin 开发中非常重要的一个概念。
它可以帮助开发者处理、转换和筛选数据。
在本篇文章中,我们将一步一步地学习如何使用Android Kotlin 中的过滤器。
我们将从什么是过滤器开始,然后探讨如何使用过滤器进行常见的数据筛选和转换操作,最后提供一些实际使用场景的示例。
# 什么是过滤器过滤器是一种数据处理工具,用于对给定的数据集合进行筛选和转换操作。
在Android Kotlin 中,过滤器通常用于对数据进行条件判断、排序和过滤。
通过使用过滤器,我们可以根据特定条件筛选出所需的数据,或者对数据进行转换,以满足我们的需求。
# 如何使用过滤器在Android Kotlin 中,我们可以通过一些简单的步骤来使用过滤器。
下面是一个简单的示例:1. 创建一个包含数据的集合。
2. 使用过滤器函数对集合进行过滤或转换操作。
3. 使用过滤后的结果进行进一步的处理或显示。
接下来,我们将通过一个具体的例子来演示如何使用过滤器。
# 示例:基于用户年龄的数据筛选假设我们有一个包含用户对象的列表,并且我们想根据用户的年龄来筛选出符合特定条件的用户。
下面是我们将要完成的任务的步骤:1. 创建一个包含用户对象的列表。
在Kotlin 中,我们可以使用以下代码创建一个包含用户对象的列表:kotlindata class User(val name: String, val age: Int)val userList = listOf(User("John", 25),User("Emily", 30),User("Michael", 35),User("Jessica", 40),User("David", 20))2. 通过使用过滤器函数对用户列表进行筛选。
Android组件间通信--深入理解Intent与IntentFilter
Android组件间通信--深⼊理解Intent与IntentFilterIntent(意图)在Android中是⼀个⼗分重要的组件,它是连接不同应⽤的桥梁和纽带,也是让组件级复⽤(Activity和 Service)成为可能的⼀个重要原因。
Intent的使⽤分为⼆个⽅⾯⼀个是发出Intent,另⼀个则是接收Intent⽤官⽅的说法就是Intent Resolving。
本主将对Intent和IntentFilter进⾏⼀些介绍。
Intent和IntentFilter是Android和⼀种消息通信机制,可以让系统的组件之间进⾏通信。
信息的载体就是Intent,它可以是⼀个要完成的动作请求,也可以⼀般性的消息⼴播,它可以由任意⼀个组件发出。
消息,也就是Intent,最终也是要被组件来进⾏处理和消化。
消息由组件发出,通常在消息的⾥⾯也会有会标记有⽬标组件的相关信息,另外⽬标组件也需要告诉系统,哪些消息是它所感兴趣的,它需要设置⼀些过滤器,以过滤掉⽆关的消息。
其实这⾥就好⽐学校⾥的⼴播,⼴播有时会播放通知,但有时也会播放要执⾏的动作,⽐如打扫卫⽣。
消息中通常都会说明消息的⽬标对象,可能是计算机学院,可能是⽼师,也可能是英语系的⼈才需要关注。
⽽每个⼈,或是学院组织,也只关⼼与他们有关的消息,当然这⾥就要他们⾃⼰去判断哪些是与他们有关的消息了。
在Android当中消息就是Intent,过滤器就是IntentFilter。
发出消息的组件可以在消息中设置⽬标组件的相关信息,⽬标组件也可以设置过滤器,然后系统会进⾏过滤,只把组件所感兴趣的消息,传递给组件。
这⾥假设读者已经了解Intent和IntentFilter的基本使⽤⽅法,且并不会进⾏全⾯的介绍,如果不了解,可以先读读官⽅⽂档,这⾥重点讲讲IntentFilter在使⽤时的⼀些注意事项。
Intent消息机制通常有⼆种,⼀个是显式Intent(Explicit Intent),另⼀个是隐式Intent(Implicit Intent)。
AndroidIntent和IntentFilter详解(四)
AndroidIntent和IntentFilter详解(四)Using intent matching 使用intent匹配intent和intent filter相匹配, 不仅为了寻找并启动一个目标组件, 也是为了寻找设备上组件的信息. 例如, android系统启动了应用程序启动器, 该程序位于屏幕的顶层, 显示了用户可以启动的程序, 这是通过查找设备上所有的action为"android.intent.action.MAIN" ,category为"UNCHER"的intent filter所在的activity实现的. 然后它显示了这些activity的图标和标题. 类似的, 它通过寻找 "android.intent.category.HOME"的filter来定位主屏幕程序.应用程序可以用相同的方式来使用intent匹配. PackageManager 有一组query...()方法来寻找接受某个特定intent 的所有组件, 还有一系列resolve...()方法来决定响应一个intent的最佳组件. 例如, queryIntentActivities()返回一个activity列表, 这些activity可以执行传入的intent. 类似的还有queryIntentServices()和queryIntentBroadcastReceivers().Note Pad Example 例子:记事本记事本示例程序让用户可以浏览一个笔记列表, 查看, 编辑, 删除和增加笔记. 这一节关注该程序定义的intent filter.在其manifest文件中, 记事本程序定义了三个activity, 每个有至少一个intent filter. 它还定义了一个content provider来管理笔记数据. manifest 文件如下:java代码:1.<manifest xmlns:android="/apk/res/android"2.package="eoe.demo">3.<application android:icon="@drawable/app_notes"4.android:label="@string/app_name" >5.6.<provider android:name="NotePadProvider"7.android:authorities="com.google.provider.NotePad" />8.9.<activity android:name="NotesList" android:label="@string/title_notes_list">10.<intent-filter>11.<actionandroid:name="android.intent.action.MAIN" />12.<categoryandroid:name="UNCHER" />13.</intent-filter>14.<intent-filter>15.<actionandroid:name="android.intent.action.VIEW" />16.<actionandroid:name="android.intent.action.EDIT" />17.<actionandroid:name="android.intent.action.PICK" />18.<categoryandroid:name="android.intent.category.DEFAULT" />19.<dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note " />20.</intent-filter>21.<intent-filter>22.<actionandroid:name="android.intent.action.GET_CONTENT" />23.<categoryandroid:name="android.intent.category.DEFAULT" />24.<dataandroid:mimeType="vnd.android.cursor.item/vnd.google.no te" />25.</intent-filter>26.</activity>27.28.<activity android:name="NoteEditor"29.android:theme="@android:style/Theme.Light"30.android:label="@string/title_note" >31.<intent-filter android:label="@string/resolve_edit">32.<actionandroid:name="android.intent.action.VIEW" />33.<actionandroid:name="android.intent.action.EDIT" />34.<actionandroid:name="com.android.notepad.action.EDIT_NOTE" />35.<categoryandroid:name="android.intent.category.DEFAULT" />36.<dataandroid:mimeType="vnd.android.cursor.item/vnd.google.no te" />37.</intent-filter>38.<intent-filter>39.<actionandroid:name="android.intent.action.INSERT" />40.<categoryandroid:name="android.intent.category.DEFAULT" />41.<dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note " />42.</intent-filter>43.</activity>44.45.<activity android:name="TitleEditor"46.android:label="@string/title_edit_title"47.android:theme="@android:style/Theme.Dialog">48.<intent-filter android:label="@string/resolve_title">49.<actionandroid:name="com.android.notepad.action.EDIT_TITLE" />50.<categoryandroid:name="android.intent.category.DEFAULT" />51.<categoryandroid:name="android.intent.category.ALTERNATIVE" />52.<categoryandroid:name="android.intent.category.SELECTED_ALTERNA TIVE" />53.<dataandroid:mimeType="vnd.android.cursor.item/vnd.google.no te" />54.</intent-filter>55.</activity>56.</application>57.</manifest>复制代码第一个activity, NoteList, 和其它activity不同, 因为它操作一个笔记的目录(笔记列表), 而不是一个单独的笔记. 它一般作为该程序的初始界面. 它可以做以下三件事:java代码:1.<intent-filter>2.<action android:name="android.intent.action.MAIN" />3.<categoryandroid:name="UNCHER" />4.</intent-filter>复制代码该filter声明了记事本应用程序的主入口. 标准的MAIN action 是一个不需要任何其它信息(例如数据等)的程序入口, LAUNCHER category表示该入口应该在应用程序启动器中列出.java代码:1.<intent-filter>2.<action android:name="android.intent.action.VIEW" />3.<action android:name="android.intent.action.EDIT" />4.<action android:name="android.intent.action.PICK" />5.<categoryandroid:name="android.intent.category.DEFAULT" />6.<dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note " />7.</intent-filter>。
Android Intent and Intent-filter SDK file总结
Android Intent and Intent-filter SDK fileIntent使用了有一些時候了,但是往往不知道其真正的內涵,通常都是用來作為Activity 傳遞數據的工具,另外些時候在使用Broadcasting來控制今天嘗試著看了下SDK文檔。
前半部分是敘述Intent的用法,后半部分是使用Notepad的例子來描述Intent的用法。
其中總結的幾張表比較好,不過想看更加細節的內容還是請閱讀android SDK文檔吧。
1. Intent使用在Activity()中:Context.startActivity()或者Activity.startActivityForResult(),中當然我們也可以在get前一個Activity回傳的值使用Activity.setResult()來回傳值2. Intent使用在Service()中:通過Context.startService()來喚醒某些service程式,或者通過Intent來捆綁某些服務,例如Context.bindService()3. Intent使用在Broadcasting()中:在廣播中我們使用Intent來發送某些廣播至系統例如Context.sendBroadcast(),Context.sendOrderedBroadcast(), or Context.sendStickyBroadcast()這些服務都需要使用Intent來開啟廣播服務綜合以上原因,android系統發覺某些Activity,Service以及Broadcasting都是需要Intent的;而且這里不會有重復發送的信息。
使用在Broadcasting的Intent 只能夠為Broadcasting來使用,而絕不會使用在Activity和Service中。
一個Intent Pass至Activity中后就只能夠被Activity使用。
详解Android中Intent对象与IntentFilter过滤匹配过程
详解Android中Intent对象与IntentFilter过滤匹配过程如果对Intent不是特别了解,可以参见博⽂该⽂对本⽂要使⽤的action、category以及data都进⾏了详细介绍。
如果想了解在开发中常见Intent的使⽤,可以参见本⽂内容有点长,希望⼤家可以耐⼼读完。
本⽂在描述组件在manifest中注册的Intent Filter过滤器时,统⼀⽤intent-filter表⽰。
⼀、概述我们知道,Intent是分两种的:显式Intent和隐式Intent。
如果⼀个Intent明确指定了要启动的组件的完整类名,那么这个Intent 就是显式Intent,否则就是隐式Intent。
当我们⽤⼀个显式Intent去启动组件时,Android会根据Intent对象所提供的component name直接找到要启动的组件,当我们⽤⼀个隐式的Intent去启动组件时,Android系统就⽆法直接知道要启动的组件名称了,本⽂就是讲解Android系统如何根据隐式Intent查找匹配到要启动的组件。
当Android系统接收到⼀个隐式Intent要启动⼀个Activity(或其他组件)时,Android会根据以下三个信息⽐较Intent的信息与注册的组件的intent-filter的信息,从⽽为该Intent选择出最匹配的Activity(或其他组件):intent中的actionintent中的categoryintent中的data(包含Uri以及data的MIME类型)也就是隐式intent对象要满⾜要启动的⽬标组件中注册的intent-filter中的<action />、<category />、<data />三个标签中的信息,即要分别通过action测试、category测试以及data测试。
intent-filter信息是在Android的manife⽂件中描述的,顾名思义,intent-filter是intent过滤器,就是⽤来过滤intent的。
安卓的四大组件
安卓的四⼤组件Android四⼤基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver⼴播接收器。
⼀:了解四⼤基本组件Activity :应⽤程序中,⼀个Activity通常就是⼀个单独的屏幕,它上⾯可以显⽰⼀些控件也可以监听并处理⽤户的事件做出响应。
Activity之间通过Intent进⾏通信。
在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
典型的动作类型有:M AIN(activity的门户)、VIEW、PICK、EDIT 等。
⽽动作对应的数据则以URI 的形式进⾏表⽰。
例如:要查看⼀个⼈的联系⽅式,你需要创建⼀个动作类型为VIEW 的intent,以及⼀个表⽰这个⼈的URI。
与之有关系的⼀个类叫IntentFilter。
相对于intent 是⼀个有效的做某事的请求,⼀个intentfilter 则⽤于描述⼀个activity(或者IntentReceiver)能够操作哪些intent。
⼀个activity 如果要显⽰⼀个⼈的联系⽅式时,需要声明⼀个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表⽰⼀个⼈的URI。
IntentFilter 需要在AndroidManifest.xml 中定义。
通过解析各种intent,从⼀个屏幕导航到另⼀个屏幕是很简单的。
当向前导航时,activity 将会调⽤startActivity(Intent myIntent)⽅法。
然后,系统会在所有安装的应⽤程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。
新的activity 接收到myIntent 的通知后,开始运⾏。
当startActivity ⽅法被调⽤将触发解析myIntent 的动作,这个机制提供了两个关键好处:A、Activities 能够重复利⽤从其它组件中以Intent 的形式产⽣的⼀个请求;B、Activities 可以在任何时候被⼀个具有相同IntentFilter 的新的Activity 取代。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android开发之旅: Intents和Intent Filters(实例部分)2010-07-31 15:38 by 吴秦, 2277 visits, 网摘, 收藏, 编辑引言上篇我们介绍了Intents和Intent Filters的理论部分,主要是介绍了:activities、services、broadcast receivers三种组件的Intent机制两种Intent(显式和隐式)及它们如何去匹配目的组件、Intent对象包含哪些信息、Intent Filters的action & category & data。
Intent的重要性,我不再着重介绍了,但我还是要说:Intent能够使应用程序突破沙盒与外界交流,者这使得Android的世界变得丰富多彩!本篇将用实例来介绍,如何应用Intent,而且继续用SMS方面的例子来阐述。
本文的主要内容如下:∙例子(需求)描述∙STEP1、添加用于显示通讯录的布局文件∙STEP2、添加Button的点击事件∙STEP3、添加通讯录活动∙STEP4、解析通讯录返回的数据∙STEP5、在清单文件AndroidManifest.xml中注册通讯录活动和读取Contact数据库的权限∙总结例子(需求)描述用手机发过SMS的人都知道:∙用户可以先编辑短信,然后再去通讯录中选择相应的人并发生给他。
∙用户可以在短信内容中插入通讯录中联系人的号码。
我们的这个例子就是要说明如何实现这个功能。
要实现这个功能,即是创建一个新的Activity选择(ACTION_PICK)通讯录中的数据,它会显示通讯录中的所有联系人并让用户选择,然后关闭并返回一个联系人的URI给短信程序。
下面介绍如何一步一步实现类似的功能,而且是在之前Android 开发之旅:短信的收发及在android模拟器之间实践(一)中发送SMS的例子(TextMessage)基础上加上从通讯录中选择联系人的功能。
STEP1、添加用于显示通讯录的布局文件我们用一个ListView来显示整个通讯录,其中用TextView显示每一记录。
它们的xml文件分别为contact.xml、listitemlayout,如下所示:====================================contact.xml<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/andro id"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><ListView android:id="@+id/contactListView"android:layout_width="fill_parent"android:layout_height="wrap_content"/></LinearLayout>=================================== listitemlayout<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/andro id"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:id="@+id/itemTextView"android:layout_width="wr ap_content"android:layout_height="wrap_content"android:padding="10px"android:textSize="16px"android:textColor="#FFF" /></LinearLayout>为了能够打开通讯录,我们还需要在TextMessage程序中加入一个Button btnContact,通过点击btnContact激活显示通讯录的活动。
这只需在main.xml文件中加入如下代码:<Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/bt nContact"android:id="@+id/btnContact"/>记得还有在values/strings.xml中相应的加入<string name="btnContact">contact</string>。
STEP2、添加Button的点击事件在上面准备工作做完之后,我们需要监听btnContact的点击事件,当用户点击btnContact时,跳转显示通讯录界面,当用户选择一个联系人之后,返回SMS程序的主界面。
这里就要用到了伟大的Intent啦!btnContact = (Button) findViewById(R.id.btnContact);btnContact.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);startActivityForResult(intent, PICK_CONTACT);}});STEP3、添加通讯录活动添加一个类文件,类名为ContactPick(表示通讯录活动名)继承Activity。
它的主要功能就是获取从SMS主程序传递来的Intent并提取数据;然后去查询通讯录数据库,取出数据并填充到STEP1中定义的ListView;最后,还需要添加当用户选择一个联系人的事件onItemClick,将结果返回给SMS主程序,这里也用到了我们伟大的Intent啦!代码如下:package blogs.www;import android.app.Activity;import android.content.Intent;import android.database.Cursor;import .Uri;import android.os.Bundle;import android.provider.ContactsContract;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.AdapterView.OnItemClickListener;public class ContactPick extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);Intent orgIntent=getIntent();Uri queryUri=orgIntent.getData();final Cursor c = managedQuery(queryUri,null,null,null,null);String[]fromColumns=new String[]{ContactsContract.Contacts.DISPLAY_NAME};int[] toLayoutIDs = new int[] { R.id.itemTextView };SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,yout.listitemlayout, c, fromColumns, toLayoutIDs);ListView lv = (ListView) findViewById(R.id.contactListView);lv.setAdapter(adapter);lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int pos,long id) {c.moveToPosition(pos);int rowId =c.getInt(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));Uri outURI =Uri.parse(ContactsContract.Contacts.CONTENT_URI.toString() + rowId);Intent outData = new Intent();outData.setData(outURI);setResult(Activity.RESULT_OK,outData);finish();}});}}STEP4、解析通讯录返回的数据从通讯录活动返回之后,我们从返回的Intent中提取数据并填充到填写电话号码的EditView 中。