`
syokouken
  • 浏览: 14311 次
  • 性别: Icon_minigender_1
  • 来自: 大阪
社区版块
存档分类
最新评论

读书笔记-- Intent

阅读更多

 

经典的Android应用程序应该有两部分组成,一是运行于前台的Activity和View对象,二是在后台运行的Intent和Service对象。 当屏幕上的某个组件完成了其相应的工作后,会把工作交给另一个组件来执行下一个任务。“交接给另一个组件”是通过Intent实现的。

 

Intent类相当于Android平台应用程序之间的通信网络。从某些方面来看,Android平台与规模更大的SOA(Service–Oriented Architecture,面向服务的架构)类似,每个Activity调用一种Intent以完成某些任务,而无需确切知道该Intent的接收器是哪个组件 

 

Intent属于后期绑定,即将Intent映射和传递到能够处理其特定任务的组件(这个过程)是在运行中进行的,而不是在构建或者编译时进行的。优点:可以将单个组件分离出来,对其进行修改,增强和维护。与调用此组件的程序无关。

 

 

Intent主要包含三个主要元素:动作(Action),类别(Category),和数据(Data),以及一个额外的可选的元素集合。

动作和类别都是一个String数据是以Uri对象的形式定义的。

Uri是通用的URI,包括方案(scheme),授权(authority),和可选的路径

 

 

 

Intent对象包含的所有组件如下

 

1.       Extras        传递给Intent的额外数据,以Bundle的形式定义

2.       Component        指定Intent使用的显示包名,可选,通常是从动作,类型,类别导出的

3.       Type          指定显示MIME(与URI解析对比)

4.       Category   相关Intent的其他元数据(例如android.intent.category.LAUNCHER)

5.       Data           以URI形式表示的数据(例如:content://content/1)

6.       Action        指示动作的完成限定String

 

           Intent定义通常表示动作,数据和属性(例如类别)的组合。系统将这些标识为一种语言使用,以正确解析应该用哪个类来处理。

 

 

 

 

一个组件(如:Activity)可以进行隐式Intent调用或者显示Intent调用

 

隐式Intent调用是指调用中有平台决定哪个组件最合适处理该Intent

显示Intent调用可以通过使用Intent(Context ctx,Class cls)的形式。利用这个方法,可以直接传递对Activity或者Service类的引用来处理Intent。这是一种紧耦合的方式。

 

 

 

 

 

 

Intent intent = New Intent(Intent.ACTION_VIEW,Uri.parse(this.link));
              startActivity(intent);

 

通过一个动作和一些数据来创建一个Intent类实例变量。对于改动做,我们使用了String常量Intent.ACTION_VIEW。该常量的值是“android.app.action.View”。这是一个包含有包名的完整限定String,以保证其唯一性。Intent有很多类似这样的常量,表示常用的动作。例如:Intent.ACTION_EDIT, Intent.ACTION_INSERT 和Intent.ACTION_DELETE。完整的常量列表http://developer.android.com/intl/ja/reference/android/content/Intent.html

 

该声明中的数据时使用Uri.paese(link)指定一个Uri(这里link包是一个http的url)。Parse(String s)方法只是解析URI部分并创建一个Uri对象。

基本上,类型可以通过Uri或方案,授权和路径的组合得到。这使得适合的组件能够响应startActivit(intent)请求。并提供由该Uri所标识的内容。

 

也就是说,当你指定了动作(ACTION_VIEW)以及数据(http://somehost/somepath),后台就会自动用调用浏览器来处理这个Intent。这就是动作中后期绑定。Android使用同一个概念却包含了很多其他的内置的数据类型。(如果有必要,可以自己定义自己的数据类型)

 

例如

 

Intent intent = New Intent(Intent.ACTION_VIEW,Uri.parse(content://contacts/people/1));
startActivity(intent);

用“联系人”的界面 显示联系人编号是1的人的信息

 

 

Intent intent = New Intent(Intent.ACTION_VIEW,Uri.parse( tel:123 ));
startActivity(intent);

显示电话号码为123的信息

 

 

Intent intent = New Intent(Intent.ACTION_VIEW,Uri.parse(content://contacts/people));
             startActivity(intent);

用“联系人”的界面 显示一个联系人List

 

 

Intent intent = New Intent(Intent.Action.ACTION_VIEW,Uri.parse(“geo:0,0?q=”+this.location.getText().toString()));
             startActivity(intent);

 用googleMap显示输入画面中location TextBox里输入的位置的地图信息。

 

以上用的都是一个动作,Intent.ACTION_VIEW,而数据却不同

 

 

 

Intent intent = New Intent(Intent.ACTION_DIAL,Uri.parse( tel:123 ));
startActivity(intent);

 将123输入的电话的拨号面板上

 

 

 

Intent intent = New Intent(Intent.ACTION_CALL,Uri.parse( tel:123 ));
startActivity(intent);

拨打电话号码123 

 

以上用的都是一个数据tel:123,但是动作不同

 

 

以上全是隐式调用。

 

 

 

 

解析Intent

 

只有三个类型的android组件可以注册成为Intent句柄:Activity,BroadcaseReceiver和Service。

这些组件通常在AndroidManifest.xml文件中使用<intent-filter>元素向平台注册,成为特定Intent类型的目标。每一个<intent-filter>元素被解析成一个IntentFilter对象。

 

一个包安装到平台上时,其中的组件将注册到平台中,一旦平台建立了一个Intent过滤器的注册表项,他基本上就知道了如何把收到的Intent请求映射到已注册的正确Activity,Broadcast-Receiver或Service

 

 

请求Intent时,Android平台使用Intent的动作,数据和类型,通过已注册的过滤器,按照动作和类别必须匹配如果指定数据类型的话,数据类型必须匹配,或者数据方案,授权,路径的组合比如匹配两条基本规则进行解析。

 

动作类别我们可以归结为String,动作需要一个字符串表示,类别可能需要多个字符串表示。

 

如果不在<intent-filter>中指定动作,则表示IntentFilter与Intent中的任何动作都匹配。

至于类别,IntentFilter的类别是Intent的一个超集。除了Intent指定的类别外,一个IntentFilter可以有多个其他的类别,但至少包含Intent指定的类别。其次,不包含类别的IntentFilter只与不包含类别的Intent匹配。

因此,动作和类别必须首先匹配。

 

     <activity android:name=".ReviewList"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.msi.manning.restautaut.VIEW_LIST" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
Intent intent = new Intent(Constants.INTENT_ACTION_LIST);
startActivity(intent); 
 

Activity 的类别标志DEFAULT表示,当某个特定类型的数据的默认动作(如,用户按下按钮)被执行时,该Activity应该启动。通常状况下,该类别标志是在IntentFilter中指定的,而不需要在Intent中出现(此时,过滤器仍将进行匹配,且过滤器的类别是Intent类别的超集)

 

 

 

 

 

 

数据

 数据或者是一个显示的MIME类型,或者是方案,授权和路径的组合

方案,授权和路径组合Uriweather://com.msi.manning/loc?zip=12345   

                                           方案             授权                        路径

MIME类型的Uricontent://com.google.provider.NotePad/notes

 

方案,授权和路径MIME类型的区别在于,MIME content://这种表示形式表示该数据类型优先于平台的数据类型。这种数据类型本身就是在提供内容的程序包的manifest文件中定义的。 

 

定义Intentfiler类时,会因方案,授权和路径的不同,已决定IntentfilerIntent的匹配。具体匹配规则如下:

1,  如果有方案而没有类型,则包含任何类型的Intent都匹配

2,  如果有类型而没有方案,则包含任何方案的Intent都匹配

3,  如果没有类型也没有方案,则与既不包含类型也不包含方案的Intent匹配

4,  如果执行了授权,则必须指定方案

5,  如果制定了路径,则必须指定方案和授权

 

(这段话,我怎么觉得这么难理解啊,这里的方案和类型,我都已经搞不明白了)

 

 

 

给出一个用Uri匹配的例子

IntentFilter

<intent-filter>
	<action android:name=”android.intent.action.VIEW” />
	<category android:name=”android.intent.category.DEFAULT” />
	<data android:scheme=”weather” android:host=”com.msi.manning” />
</intent-filter>

Intent

Intent = New Intent(Intent.ACTION_VIEW,Uri.parse(“weather://com.msi.manning/loc?zip=1234”))
 

 

再给一个例子,截取自 androidmanifest.xml

<activity android:name=”ReportViewDetail”  android:lable=”@string/app_name_view_detail”>
	<intent-filter>
		<action android:name=”android.intent.action.VIEW” />
		<category android:name=”android.intent.category.DEFAULT” />
		<data android:scheme=”weather” android:host=”com.msi.manning” />
	</intent-filter>
        <intent-filter>
		<action android:name=”android.intent.action.VIEW” />
		<data android:scheme=”weather” android:host=”com.msi.manning” />
	</intent-filter>
         <intent-filter>
		<action android:name=”android.intent.action.MAIN” />
		<category android:name=”android.intent.category.LAUNCHER” />
	</intent-filter>
</activity>
 值得一提的是,ReportViewDetail Activitymanifest文件中注册已接收weather://com.msi.manningIntent,并解析该URI路径以获得数据。这种方式是任何应用程序都可以调用该Activity,而无需知道除URI以外的任何信息,这就是Android平台特意设计,提倡在运行时建立联系的职责分离模式(后期绑定


介绍几种Android提供的活动 

Intent.ACTION_VIEW

geo:latitude,longitude

打开地图应用程序并显示指定的纬度和精度

Intent.ACTION_VIEW

geo:0,0?q=street+address

打开地图应用程序并显示指定的地址

Intent.ACTION_CALL

tel:phone_number

打开电话程序并拨打指定的电话号码

Intent.ACTION_DIAL

tel:phone_number

打开电话程序并拨下指定的电话号码(但不拨出)

Intent.ACTION_DIAL

Voicemail:

打开电话应用程序并拨下该语音信箱的电话号码(但不拨出)

Intent.ACTION_VIEW

http://web_address

打开浏览器应用程序并显示指定URL

Intent.ACTION_VIEW

https://web_address

打开浏览器应用程序并显示指定URL

Intent.ACTION_WEB_SEARCH

plain_text

打开浏览器应用程序并用google搜索引擎

 

 

Intent对象用于在android应用程序中之间的切换,虽然这是Intentandroid的主要用途,但并不是唯一用途。使用Context类提供的众多方法之一,Intent还可以用于向所有已经配置的广播接收器广播事件。

sendBroadcase(Intent intent)   --------------------- 广播Intent的简单形式

广播Intent时,实际上是重用了Intent的概念,以在后台发送事件。虽然这里使用的仍然是Intent,但是与调用前台Activity路径的Intent有所不同。广播Intent不调用Activity。

 

 

 

 

 

 

分享到:
评论
1 楼 新入职 2010-08-26  
现在正在学这个,文章很有帮助.....

相关推荐

Global site tag (gtag.js) - Google Analytics