在学习Intent意图之前,先介绍一点理论知识。看晕了的也不要紧,后面我将会用详细的实例,向大家讲解Intent (意图)。

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活 Android应用的三个核心组件:活动、服务和广播接收器(四大组件中还有一个是“内容提供者”--Content Provider )

所谓的“意图”,不要想的太复杂,通俗点说就是“告诉Android系统,你想做什么事儿...”,这是我个人的一点浅见。

Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

在上一篇文章Activity的激活及传值中,我们使用Intent(意图)来激活Activity,并传递参数的小实例,就是典型的“显示意图”

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

在使用Android开发“电话拨打功能”的时候,我们通常会使用类似如下的代码:

package dinglang.com.phone;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 phone extends Activity {    /** Called when the activity is first created. */private    EditText phoneText;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                //找到拨号按钮       Button button =(Button)this.findViewById(R.id.btnCall);       phoneText =(EditText)this.findViewById(R.id.txtPhoneNumber);       //给button注册事件       button.setOnClickListener(new ButtonLis());    }    //定义一个私有的内部类,而且还是不能被继承的。继承至OnClickListener接口    private final class  ButtonLis implements View.OnClickListener    {                public void onClick(View v) {            // TODO Auto-generated method stub            //获得文本框输入的电话号码        String mobile =    phoneText.getText().toString();                        //调用系统底层API,启动拨号程序去拨打这个号码            Intent intent =new Intent("android.intent.action.CALL",Uri.parse("tel:"+mobile));        startActivity(intent);//内部会自动添加anroid.intent.category.DEFAULT        }                    }}


其中“android.intent.action.CALL”是意图过滤器中的“动作名称”。

有人可能会疑问,我在“电话拨号程序”中好像没有修改项目清单,没有往里面添加任何内容,好像也可以啊!因为电话拨号功能属于Android系统内置,系统会自动去匹配(比较特殊,所以不需要用户手动去添加)。自动生成类似代码:

<intent-filter> <action android:name="android.intent.action.CALL" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="tel" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.CALL" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/phone" /> </intent-filter>


下面是一个小例子,Activity端的代码:
package cn.itcast.intent;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends Activity {    /** Called when the activity is first created. */    @Override         public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                Button button = (Button) this.findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent();                intent.setAction("cn.itcast.lao.li");                //intent.setData(Uri.parse("itcast://www.itcast.cn/person"))                //intent.setType("image/gif");//使用setType方法后,将会清空前面的设置,所以可以使用下面这种方式                intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");                startActivity(intent);            }        });    }}

通常情况,我们在通过隐式意图Intent激活其他组件时,为了匹配,需要在项目清单文件中类似代码:
<activity android:name=".OtherActivity"  android:label="@string/app_name">            <intent-filter>                <action android:name="cn.itcast.lao.li" />                <action android:name="cn.itcast.lao.zhang" />                <category android:name="android.intent.category.DEFAULT" />                <category android:name="cn.itcast.category.li" />                <data android:scheme="itcast" android:host="www.itcast.cn" android:path="/person"/>                <data android:mimeType="image/gif"/>            </intent-filter>        </activity>

  

以前老是看到项目清单文件中有“intent-filter”...,一直不知道有啥用。现在应该明白,意图过滤器的作用了吧?

更多相关文章

  1. Windows平板装Android双系统及建立UEFI引导全攻略(windows8.1+and
  2. Android webview 实现h5中调用原生系统相册/相机并进行图片压缩
  3. Android 桌面组件【app widget】 进阶项目--心情记录器
  4. Android系统定制和源码开发以及源码编译
  5. Android开发平台振动器系统详解
  6. Binder子系统之调试分析(一)

随机推荐

  1. Android之TextView设置String文本颜色
  2. Android TextView字体颜色等样式详解
  3. 「横竖屏」 「分屏」 「虚拟按键」
  4. Gradle-jar-aar
  5. 在Android中使用GIF图片
  6. Android 主动获取电量的方法
  7. Android 网络连接处理 学习笔记
  8. 做android 开发遇到的问题及解决办法记录
  9. Android Sqlite Failed to open database
  10. android学习——activity的生命周期