Intent(意图)用法

1、 什么是Intent?它是干什么用的?

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

·        通过startActivity() orstartActivityForResult()启动一个Activity;

·        通过 startService() 启动一个服务,或者通过bindService() 和后台服务交互;

·        通过广播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())发给broadcast receivers

2、 Intent语法结构

语法结构:

Intent intent = new Intent() ;

Intent intent = new Intent(Intent) ;

Intent intent = new Intent(action) ;

Intent intent = new Intent(action ,Uri) ;

Intent intent = new Intent(Context.this,Activity.class) ;

Intent intent = new Intent(action,Uri,this,Activity.class) ;

3、 Intent特点

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

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

隐式意图:没有调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。那么Android是怎样寻找到这个最合适的组件呢?

指定了一个intent-filter,Intent Filter(过滤器)其实就是用来匹配隐式Intent的,如果Intent Filter定义的动作、类别、数据(URI和数据类型)与Intent匹配,就会使用Intent Filter所在的组件来处理该Intent。想要接收使用startActivity()方法传递的隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"

例如:

声明意图:

<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>

调用:

Intent intent = new Intent();

intent.setAction("cn.itcast.lao.li");

intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");

startActivity(intent);

注意:

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent, 最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的, 判断方法如下:

如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;

如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。

如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。

4、 Intent主要属性

1)Action,也就是要执行的动作

SDk中定义了一些标准的动作。当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如"com.example.project.SHOW_COLOR”),并可定义相应的Activity来处理我们的自定义动作。

2)Data,也就是执行动作要操作的数据

Android 中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其 URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由contentprovider提供的数据则为content: URIs。

3)Type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

4)Category(类 别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。

5)Component(组 件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。

6)Extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

5、关于Intent常用代码:

1).无参数Activity跳转

Intent intent = new Intent(Activity.Main.this, Activity2.class);

startActivity(intent);

2)向下一个Activity传递数据(使用Bundle和Intent.putExtras)

Intent intent = new Intent(Activity.Main.this, Activity2.class);

Bundle bundle=new Bundle();

bundle.putString("name", "This is from MainActivity!");

intent.putExtras(bundle);       // it.putExtra(“test”, "shuju”);

startActivity(intent);            // startActivityForResult(it,REQUEST_CODE);

 

数据的获取可以采用

Bundle bundle=getIntent().getExtras();

String name=bundle.getString("name");

3)向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)

     

  Intent intent=getIntent();

  Bundle bundle2=new Bundle();

  bundle2.putString("name", "This is from ShowMsg!");

  intent.putExtras(bundle2);

  setResult(RESULT_OK, intent);

 

4)回调上一个Activity的结果处理函数(onActivityResult)  

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        // TODO Auto-generated method stub

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode==REQUEST_CODE){

            if(resultCode==RESULT_CANCELED)

                  setTitle("cancle");

            else if (resultCode==RESULT_OK) {

                 String temp=null;

                 Bundle bundle=data.getExtras();

                 if(bundle!=null)   temp=bundle.getString("name");

                 setTitle(temp);

            }

        }

    }

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值