Android Intent详解

在读罢他人的博客之后,自己对Intent的整理如下:
首先说自己的心得:Intent实现了解耦;
一:Intent是”目的,意图”,主要用来在组件之间实现通信。具体而言:
1.Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。
2.Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
3.activity、service和broadcast receiver之间是通过Intent进行通信的,而另外一个组件Content Provider本身就是一种通信机制,不需要通过Intent。
二:关于Intent实现三大组件之间的通信:
1.使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。
2.将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给 Context.bindService()来绑定一个service。
3.将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。
三:intent的七大属性:
1.component(组件):目的组件
2.action(动作):用来表现意图的行动
3.category(类别):用来表现动作的类别
4.data(数据):表示与动作要操纵的数据
5.type(数据类型):对于data范例的描写
6.extras(扩展信息):扩展信息
7.Flags(标志位):期望这个意图的运行模式
Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。谷歌官方建议使用隐式Intent。上述属性中,component属性为直接类型,其他均为间接类型。
下面详细介绍用Intent的属性来启动Activity的过程:
四:
1.Component属性明确指定Intent的目标组件的类名称。(属于直接Intent)
如果 component这个属性有指定的话,将直接使用它指定的组件。指定了这个属性以后,Intent的其它所有属性都是可选的。

 button1.setOnClickListener(new OnClickListener() {            
             @Override
             public void onClick(View v) {
                  //创建一个意图对象
                  Intent intent = new Intent();
                  //创建组件,通过组件来响应
                  ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);
                  intent.setComponent(component);                
                  startActivity(intent);                
             }
         });

简单的写法如下:

Intent intent=new Intent();
intent.setClass(MainActivity.this,GuideActivity.class);
startActivity(intent);

或者:

Intent intent=new Intent(MainActivity.this,GuideActivity.class);
startActivity(intent);

2.通过Action和category来启动Activity.Action必须与Category来一起使用来启动组件:
在清单文件中配置:

          <intent-filter>
                <action android:name="myGuideActivity"></action>
                <category android:name="android.intent.category.DEFAULT"/>
           </intent-filter>

在代码中设置:

intent.setAction("myGuideActivity");
startActivity(intent);

来启动Activity
3.data(数据):表示与动作要操纵的数据 :
Data是用一个uri对象来表示的,uri代表数据的地址,属于一种标识符。通常情况下,我们使用action+data属性的组合来描述一个意图:做什么
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如应用程序中需要展示一个网页:

 button1.setOnClickListener(new OnClickListener() {            
              @Override
              public void onClick(View v) {
                  Intent intent = new Intent();
                  intent.setAction(Intent.ACTION_VIEW);
                  Uri data = Uri.parse("http://www.baidu.com");
                  intent.setData(data);                
                  startActivity(intent);        
              }
        });

其中指定了Intent的action是 Intent.ACTION_VIEW,表示查看的意思,这是一个Android系统内置的动作
4.extras(扩展信息):扩展信息是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
5.type(数据类型):对于data范例的描写
如果Intent对象中既包含Uri又包含Type,那么,在中也必须二者都包含才能通过测试。Type属性用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。data和type属性一般只需要一个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,如果想要两个属性同时设置,要使用Intent.setDataAndType()方法。
6.Flags(标志位):期望这个意图的运行模式,一个程序启动后系统会为这个程序分配一个task供其使用,另外同一个task里面可以拥有不同应用程序的activity。那么,同一个程序能不能拥有多个task?这就涉及到加载activity的启动模式,这个需要单独讲一下。
注:android中一组逻辑上在一起的activity被叫做task,自己认为可以理解成一个activity堆栈。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值