Intent—隐式Intent与显示Intent

来源:互联网 发布:中国产业经济数据库 编辑:程序博客网 时间:2024/04/30 01:45
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同的组件之间传递数据。Intent一般可被用于启动活动、启动服务、以及发送广播等场景。
Intent大致用法可以分为两种:显示Intent和隐式Intent
显示Intent
Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, class<?> cls)。这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。
Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数。
例:在按钮的点击事件中:

button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

        startActivity(intent);

    }

});

首先我们构建出了一个Intent,传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,这样我们的“意图”就是在FirstActivity这个活动的基础上打开SecondActivity这个活动。然后通过StartActivity()方法来执行这个Intent
隐式Intent
通过在AndroidManifest.xml中<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category。

<activity android:name=".SecondActivity" >

    <intent-filter>

        <action android:name="com.example.activitytest.ACTION_START" />

        <category android:name="android.intent.category.DEFAULT" />  

         <category android:name="com.example.activitytest.MY_CATEGORY"/>

    </intent-filter>

</activity>

在<action>标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_ START这个action,而<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category

只用<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent intent = new Intent("com.example.activitytest.ACTION_START");

        startActivity(intent);

    }

});

可以看到,我们使用了Intent的另一个构造函数,直接将action的字符串传了进去,表名要启动能够响应com.example.activitytest.ACTION_START这个action的活动。

注:android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。

每个Intent钟只能指定一个action,但却能指定多个category。如下:

button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent intent = new Intent("com.example.activitytest.ACTION_START");

        //需要在<activity>标签中加入<category>声明,否则程序会报错。

        intent.addCategory("com.example.activitytest.MY_CATEGORY");

        startActivity(intent);

    }

});

更多隐式Intent的用法

使用隐式Intent,我们不仅可以再自己的程序内活动,还可以启动其他程序的活动。例如:

button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent intent = new Intent(Intent.ACTION_VIEW);

        intent.setData(Uri.parse("http://www.baidu.com"));

        startActivity(intent);

    }

});

这里,首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法,将一根网址字符串解析成一根Uri对象,再调用Intent的setData()方法,将这个Uri对象传递进去。

<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容。

android:scheme

用于指定数据的协议部分,如上的http

android:host

用于指定数据的主机名部分,如www.baidu.com

android:port

用于指定数据的端口部分,一般紧随在主机名之后。

android:path

用于指定可以处理的数据类型,运行使用通配符的方式进行指定。

只有<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。不过一般在<data>标签中都不会指定过多的内容

<activity android:name=".ThirdActivity" >

    <intent-filter>

        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />

        <data android:scheme="http" />

    </intent-filter>

</activity>

geo表示显示地理位置、tel表示拨打电话。

button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent intent = new Intent(Intent.ACTION_DIAL);

        intent.setData(Uri.parse("tel:10086"));

        startActivity(intent);

    }

});

首先指定了IntentactionIntent.ACTION_DIAL,这又是一个Android系统的内置动作。然后在data部分指定了协议是tel,号码是10086。重新运行一下程序,在FirstActivity的界面点击一下按钮就会出现电话号码拨号界面

--------------------------------------------------------------------------------------------------------------------------------------

android 开发交流群:264706196



0 0
原创粉丝点击