热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android基础系列Intent简析

在Android系统设计中,Intent可以被应用于除ContentProvider外的其他三种组件(即Activity,Service

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 plaincopy
  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种属性都可以不是唯一的。
推荐阅读
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
author-avatar
灬L龙灬_423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有