android开发之Intent(2)

Data、Type

     Data属性通过用于向Action属性提供操作的数据。Data属性接受一个Uri(格式形如:scheme://host:port/path)对象。

     Type属性则是用于指定Data所指定Uri对应的MIME类型,MIME的格式形如:abx/xyz

     声明Data与Type属性是通过<data…/>元素来设置,格式如下:

<data

android:mimeType=""

android:scheme=""

android:host=""

android:path=""

android:port=""/>

     其匹配规则如下:

     1. 如果Intent指定了Type属性,那么Activity只有<intent-filter…/>中的<data…/>的mimeType与Type的值相同才能被启动

     2. 如果没有指定Type属性,只指定了Data属性,那么其匹配规则如下:

     如果只Activity的<data…/>中指定了scheme,那么Intent中只要Data值中的scheme只要与Activity中的相同,其它的host、port、path不管等于多少,都可启动该Activity。

     另外还有scheme+host、scheme+host+port、scheme+host+path与上面的匹配过程一样,只要Intent值与Activity的<data…/>值相同即可,而没有指定host,单独指定port和path是不起作用的。

     举个例子:

下面列了5个Activity在AndroidManifest.xml中的<data…/>属性,下面将简称为a1,a2,a3,a4,a5。

        <activity
            android:name=".DataTypeAttr"
            android:label="@string/title_activity_data_type_attr">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_scheme"
            android:name=".SchemeActivity"
            android:label="指定scheme的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 只要Intent的Data属性的scheme是lee即可启动该Activity -->
                <data android:scheme="lee" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_host"
            android:name=".SchemeHostPortActivity"
            android:label="指定scheme、host、port的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 只要Intent的Data属性的scheme是lee、且host是www.fkjava.org
                、port是8888即可启动该Activity -->
                <data
                    android:scheme="lee"
                    android:host="www.fkjava.org"
                    android:port="8888" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_sp"
            android:name=".SchemeHostPathActivity"
            android:label="指定scheme、host、path的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 只要Intent的Data属性的scheme是lee、且host是www.fkjava.org
                、path是/mypath即可启动该Activity -->
                <data
                    android:scheme="lee"
                    android:host="www.fkjava.org"
                    android:path="/mypath" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_path"
            android:name=".SchemeHostPortPathActivity"
            android:label="指定scheme、host、port、path的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 需要Intent的Data属性的scheme是lee、且host是www.fkjava.org
                、port是8888、且path是/mypath才可启动该Activity -->
                <data
                    android:scheme="lee"
                    android:host="www.fkjava.org"
                    android:port="8888"
                    android:path="/mypath"/>
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/ic_type"
            android:name=".SchemeHostPortPathTypeActivity"
            android:label="指定scheme、host、port、path、type的Activity">
            <intent-filter>
                <action android:name="xx"/>
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 需要Intent的Data属性的scheme是lee、且host是www.fkjava.org
                、port是8888、且path是/mypath
                、且type是abc/xyz才可启动该Activity -->
                <data
                    android:scheme="lee"
                    android:host="www.fkjava.org"
                    android:port="8888"
                    android:path="/mypath"
                    android:mimeType="abc/xyz"/>
            </intent-filter>
        </activity>

   下面将举5个Intent,下面将简称为i1,i2,i3,i4,i5。首先来看,只有a5设有mimeType,而下面的Intent中只有i5含有mimeType属性,因为a5只可能被i5启动,而其它4个属性也一一对应相等,因此a5可以被i5启动。再看其它的,a1,只有scheme属性为lee,因此,而i1,i2,i3,i4都的scheme属性都为lee,因此a1可以被i1,i2,i3,i4启动。a2,scheme=lee,host=www.fkjava.org,port=8888,可以被i2,i4启动。a3,scheme=lee,host=www.fkjava.org,path=/mypath,可以被i3,i4启动。而a4则只可以被i4启动。

public void scheme(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.crazyit.org:1234/test"));
        startActivity(intent);
    }
    public void schemeHostPort(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
        startActivity(intent);
    }
    public void schemeHostPath(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:1234/mypath"));
        startActivity(intent);
    }
    public void schemeHostPortPath(View source)
    {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
        startActivity(intent);
    }
    public void schemeHostPortPathType(View source)
    {
        Intent intent = new Intent();
        // 同时设置Intent的Data、Type属性
        intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath")
            , "abc/xyz");
        startActivity(intent);
    }

 

Extra属性

该值是一个Bundle对象,Bundle对象可以存入多个key-value对,这样就可以通过Intent在不同的Activity之间进行数据交换。

 

Flag属性

Flag属性主要用来启动activity时对activity的一些行为作控制,具体作用后续再研究。

 

     目前除了对Component和Extra属性的作用有了比较清晰的认知外,另外4个还是不太清晰,后续有待深入研究。

时间: 2025-01-31 00:45:17

android开发之Intent(2)的相关文章

Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下.1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); startActivity(intentPhone); 2)跳转到拨号界面 Intent intent = newIntent(Intent.ACTION_DIAL,Uri.pars

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, 结果总是存在好几个同样的activity,就算要返回的activity正在前台,点击消息后也会重新打开一个一样的activity,返回好几次才能退出, 而不能像qq之类的点击通知栏消息回到之前存在的activity,如果存在就不再新建一个activity 说的有点绕,如果是遇到此类问题的肯定能懂,没遇到

android开发之Intent(1)

Intent可以用于启动组件,并且携带数据,充当组件间通信的媒介. Intent对象大致包含Component.Action.Category.Data.Type.Extra和Flag7种属性. 以下将分别说说. Component Component可以通过指定包名和类名来启动特定组件.因此,明确指定Component属性的Intent也称为显式Intent.例子如下: // 创建一个ComponentName对象 ComponentName comp = new ComponentName(

Android开发之Intent.Action

转载自 http://www.cnblogs.com/hanyonglu/archive/2012/03/26/2417278.html 1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Output:nothing <activity android:name=".Main" android:label="@string/app_

Android开发之intent

Intent意为:意图.简单的理解就是用来从一个Activity/Service跳转到另一个Activity/Service中,并可以携带数据,也可以在这个程序调用别的程序.这样我们虽然不懂如何结息条形码,却可以通过开放的android平台,在我们的程序调用专家写好的程序来实现功能. Intent的用法: (1)从MainActivity跳转到NewActivity Intent intent=new Intent(MainActivity,this,NewActivity.this); sta

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

Android开发之WebView详解

概述: 一个显示网页的视图.这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础.它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等. 需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中: <uses-permission android:name="android.permission.INTERNE

Android开发之IPC进程间通信-AIDL介绍及实例解析

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期

Android开发之TextView高级应用

我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.下面就和大家分享一下TextView的一些使用技巧. Android中设置文本样式的几种方法: 1.将android:autoLink属性值设为true.系统会自动识别E-mail.电话.网址等特殊文本. 2.使用Html标签,例如,<font>.<img>等.不要设置 android:autoLink 属性. 3.在Java代码中直接使用Span对象来设置文本样式.这种方法需要将文本