Android基础系列-----------Intent简析

来源:互联网 发布:java最新版本 编辑:程序博客网 时间:2024/06/08 12:04
在Android系统设计中,Intent可以被应用于除ContentProvider外的其他三种组件(即Activity,Service和BroadcastReceiver)。

一、Intent属性

1、ComponentName
        Intent分为显性(Explicit Intents)和隐性(Implicit Intents)。如果在Intent中特别指定了目标方的“Component Name”,同时指定它所在的PackageName,比如:“com.example.project.HelloActivity“,那么系统就会直接将此Intent发往这个特定的应用,而不需要做额外的匹配工作。
2、Category
        它将Intent从大的方向上进行区分和归类。Intent的所有属性值实际上都只是一串字符,因而是可以自定义的。
3、Action
        表明要做什么,或者什么事件发生了(常用于广播的情况。比如设备开机时会有系统广播发出。如果应用程序希望实现开机自启动,就可以监听这个广播)。用户也可以自定义唯一的Action。
4、Data
        如果上面的Action中表明了某人去公安局办理签证,那么这里的Data就作为签证业务的补充材料,Action理论上是围绕Data提供的数据来开展业务的。当然也有不需要Data补充信息的情况,如在ACTION_CALL的情况下,电话号码是必须作为Data来传递的;而针对Broadcast(如ACTION_SCREEN_ON)组件的Action,它们本身就蕴含了足够的信息,因而不需要Data的支持。不同的Action,其对应的Data格式会有差异。
5、Extras
        Extras可以理解为Extra Data,是对上面Data属性的补充。不过两者在数据的格式上有明显区别。Data采用了类似scheme://uri的表达方式;而Extras则是一种键值对实现。它们在表达不同场景的数据时有各自的优势,使用时应具体问题具体分析。发送方通过一系列putXxx()方法将键值对存入Intent中,然后接收方 就可以用相对应的getXxx()来获取这些Extra数据,这些方法内部会维护一个Bundle对象来保证进程间数据的准确传输。
6、Flags
        Flags和Activity中的LaunchMode功能基本相同,它规定了系统如何去启动一个Activity(比如指定即将启动的Activity应该属于哪一个Task)。

二、Intent匹配规则

        Intent是和Intent-filter配套使用的。具体而言,Intent-filter是每个组件的属性标签,它们在AndroidManifest.xml声明时就已经贴上了。而Intent则是程序运行过程中产生的实时需求,系统接收到这些请求后与现有的Intent-filter进行匹配,然后选择最合适的组件元素以响应。打个比方,Intent代表了女生的择偶意愿,而Intent-filter则是众男生的属性描述——年龄、长相、收入等。        
Intent的典型匹配过程包括如下几个步骤
1、注册组件
        除了在AndroidManifest.xml中静态注册外,BroadcastReceiver还可以在程序运行中进行动态注册。这两种方式区别如下:
  • 静态注册
             也即应用程序事先将Intent-filter写到AndroidManifest.xml文件中。
  • 动态注册
             例如:
[java] view plain copy
  1. public class DynamicBroadcastReceiver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         if (android.intent.action.BOOT_COMPLETED.equals(intent.getAction)) {  
  6.             //相应处理  
  7.         } else {  
  8.             //其他处理  
  9.         }  
  10.     }  
  11.   
  12. }  
  13. IntentFilter filter = new IntentFilter();  
  14. filter.addAction("android.intent.action.BOOT_COMPLETED");  
  15. registerReceiver(new DynamicBroadcastReceiver(), filter);  

2、发起方主动向系统提供Intent
        Activity---->对应startActivity();
        Service---->对应startService();
        BroadcastReceiver---->对应sendBroadcast();
3、系统将Intent和对应组件类型里所有的intent-filter进行匹配,以寻找最佳结果
        影响Intent匹配规则的只有3个关键因素,即:
  • Category
  • Action
  • Data
        而其余两个属性Extras和Flags则只有在选中的组件运行后才能起作用。每个Component都可以有若干个intent-filter,每个filter里的上述3种属性都可以不是唯一的。
0 0
原创粉丝点击