Android的几个主要组件可以相互协调工作,共同组成一个完整的Android应用。这些组件之间的通信就需要借助于Intent完成。
一、Intent的基本概念
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
在一个Android应用中,Intent是对执行某个操作的一个抽象描述,Intent 负责提供组件之间相互调用的相关信息传递,实现调用者和被调用者之间的解耦。
二、Intent的属性
Intent是对执行某个操作的一个抽象描述,其描述的内容包括,对执行动作Action的描述、对操作数据的描述、还有4种附加属性的描述。分别介绍如下:
Action:对执行动作的描述,是个字符串,是对所将执行的动作的描述,在Intent类中定义了一些字符串常量作为标准动作,譬如:
public static final String ACTION_DIAL = "android.intent.action.DIAL"public static final String ACTION_SENDTO = "android.intent.action.SENDTO";
我们还可以自定义Action,并定义相应的Activity来处理我们自定义的行为。
data:是对执行动作所要操作的数据的描述,Android中采用URI来表示数据,譬如在联系人应用中,指向联系人1的URI可能为:content://contacts/1 (由content provider提供的数据类型是content) 。 结合Action和data可以基本表达出意图。
•VIEW_ACTION content://contacts/1 — 显示标识符为”1″的联系人的详细信息
•EDIT_ACTION content://contacts/1 — 编辑标识符为”1″的联系人的详细信息
•VIEW_ACTION content://contacts/ — 显示所有联系人的列表
•PICK_ACTION content://contacts/ — 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个 Intent,要求用户在联系人列表中选择一个联系人。
除了Action和data之外,还有4个属性。
catagory 类别:是被请求组件的额外描述信息,Intent类中也定义了一组字符串常量表示Intent不同的类别。完整的列表可以看API文档中Intent类的相应部分。
public static final String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";public static final String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";
extra 附加信息:除了data之外,还可以通过extra附加信息,extra属性使用Bundle类型进行数据传递,我们可以把Bundle当做HashMap来理解,附加数据可以通过 intent.putExtras() 和 intent.getExtras() 进行传入和读取。 就像这样,获取附加信息: Bundle bundle = intent.getExtras();
添加附加信息: Bundle bundle = new Bundle(); intent.putExtras(bundle);
component 组件:显式指定Intent的目标组件的名称。如果指定了component属性,系统会直接使用它指定的组件,而非匹配查找。
type 数据类型:显式指定Intent的数据类型,一般Intent的数据类型都能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型和不再进行推导。
三、解析Intent
Intent是一种在不同组件之间传递的请求信息,是应用程序发出的请求和意图,作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。
当指定了component属性后,就是显式的指定了目标组件,也就是接收端。如果没有明确指定目标组件,那么Android系统会使用 Intent 里的(action,data,category)三个属性来寻找和匹配接收端。
四、IntentFilter
应用程序组件可以使用IntentFilter来向系统说明自己可以响应和处理那些Intent请求。组件一般通过AndroidManifest.xml文件的<Intent-Filter>描述。
- <activity android:name=”.MainTinyPhone” android:label=”@string/app_name”><intent-filter><action android:name=”android.intent.action.MAIN” /><category android:name=”android.intent.category.LAUNCHER” /></intent-filter></activity>
五、简单的拨打电话的例子
这是一个简单的拨打电话的程序,它可以截获手机上的拨号按键发出的请求,自己输入号码,并把数据传给系统的打电话程序,从而实现打电话功能。
先上效果图:
按绿色的拨号按钮的时候会呼出一个菜单让你选择使用哪个拨号程序。
我们选择简单拨号程序,出现输入框可以填写电话号码,并拨号。
点击拨号后,调用了系统的拨号程序。
最终实现了拨号:
再上代码,MainTinyDial.java的代码:
- package andorid.basic.lesson8;
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- public class MainTinyDial extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 按照main.xml來渲染用戶界面
- setContentView(R.layout.main);
- // 找到存放电话号码的可编辑文本框
- final EditText PhoneNumberEditText = (EditText) findViewById(R.id.PhoneNumberEditText);
- // 找到拨号按钮
- Button button = (Button) findViewById(R.id.Button01);
- // 为拨号按钮设置一个点击事件观察者
- button.setOnClickListener(new Button.OnClickListener() {
- //实现监听器接口的匿名内部类,其中监听器本身是View类的内部接口
- //实现接口必须实现的onClick方法
- @Override
- public void onClick(View v) {
- // 获得可编辑文本框中的值,也就是电话号码
- String phoneNumber = PhoneNumberEditText.getText().toString();
- // new Intent(行为,数据),其中action_dial是拨号行为,数据是电话号码
- Intent intent = new Intent(Intent.ACTION_DIAL, Uri
- .parse("tel://" + phoneNumber));
- // 去调用那些可以处理拨号行为的Activity
- startActivity(intent);
- }
- });
- }
- }
Intent的内容就讲到这里了。Intent使得Android组件间的通信非常灵活方便,在Android开发中使用频率比较高,掌握它很有必要。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。