温故而知新Android篇之三

接下来得复习一下Intent和IntentFilter的相关知识点.首先,Intent有两种调用方式:显式直接调用,间接调用.当我们直接指定了component属性的Intent(调用setComponent(componentName)或setClass(context,class)来指定)就属性直接调用,在许多情况下我们会用到,例如,在同一个应用程序中的Activity的切换,或者是不同应用程序之间的Activity切换.而间接指定就是没指定component属性的Intent,就是不指定接收者,由Android框架去寻找。那Android框架是如何去寻找,怎样寻找合适的接收者呢?当使用Intent的间接调用时我们可以通过配置AndroidManifest.xml设定IntentFilter(Action,data,category)来声明自己能接收的Intent。为了能更加好地理解这个过程,简单说一下匹配规则:当Intent指有了Action,则目标组件的IntentFilter的Action列表中必须包含此Action。当Intent没提供type,系统将从Data中得到数据类型,和Action一样,目标组件的数据类型列表中必须包含Intent的数据类型;当Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中.

在Android框架中Intent担当十分重要的角色,我们可以把它理解成一个传达我们的想法和意图的一个信使.接下来来介绍下Intent组件和其它组件之间的一些联系,和他们是怎样互相配合工作的.首先是,Intent和Activity.在Android中,Intent和Activity之间是直接相互操作.Intent的最常用的用途是绑定应用程序组件,用来在应用程序的Activity间启动、停止和传输。Intent可以显式地指定类去打开,也可以使用隐式Intent,用户指定要执行的动作,作为可选项包含目标需要执行的动作,在后者的情况下,运行时会选择Activity打开,使用一个熟悉的处理过程-"Intent解析".接着,Intent和Broadcast Receiver的关系,通过sendBroadcast方法在组件间广播匿名消息,用户可以在应用程序中实现BroadcastReceiver来监听和响应这些广播的Intent。广播Intent让用户的程序更加开放,通过广播事件,第三方开发者响应事件而不需要修改用户的原始程序。Broadcat Receiver监听广播,当广播的Intent与注册的接收器的Intent Filter匹配时,onReceive方法会执行。onReceive处理函数必须在5s内完成,否则程序无响应对话框会显示。

大家可能会有一个疑问,IntentFilter具体是一个什么组件,它能实现什么功能呢?其实,IntentFilter就是用来注册Activity、Service和Broadcast Receiver具有能在某种数据上执行的一个动作的能力.现在具体来说明一个IntentFilter的解析过程,明白了这个过程有利于我们理解其它组件的一些工作原理.第一步,Android将APK包中可获得的Intent Filter放到一个列表中.第二步,动作与正在解析的Intent种类不关联的IntentFilter会从列表中删除;动作匹配指定Intent Filter包含特定的动作或没有指定的动作,至少有一个动作与Intent指定的动作匹配,则这个Intent Filter必须包含所有在解析的Intent中定义的种类,一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。第三步,Intent的数据URI中的部分会与Intent Filter中的data标签比较,任何不匹配都会导致Intent Filter从列表中删除。如果没有指定data值的Intent Filter会和所有Intent Filter数据匹配。第四步,如果这个过程中有多于一个组件解析出来的话,它们会以优先度排序,供用户选择.注:Android本地的应用程序和第三方应用程序一样,都是Intent解析过程中的一部分,它们没有更高的优先度.另外,IntentFilter还有一个作用就是,隐式Intent响应与责任传递.当匹配后的响应,需要找到它要执行的动作以及执行动作需要的数据,调用getIntent方法来释放Intent,通过getData和getAction来查找Intent的数据和动作。使用类型安全的get<type>Extra方法来释放临时信息包中的额外信息.最后还有一个作用就是传递作用.可以使用startNextMatchingActivity方法来将动作处理的责任传递给下一个最匹配的应用程序组件.

好到现在为止,我们把Android框架的一些常用组件大概地复习了一下,现在我想总结一下android通信机制.就我接触到的和学习到的有四种方式:1.使用handler来进行通信.handler是主线程(UI线程)的一个子线程,可以给主线程发送数据从而更新主线程的UI与逻辑。由是handler是子线程非UI线程,所以不会阻塞主线程,避免了ANR(系统强制关闭提示)。2.Notifation通知栏信息,它的优点是不会打断用户正在阅读的内容,除非用户手动将Notifation通知栏拉下。3.广播的发送与接收。Android开发中如果需要对两个完全没关系的程序之间进行通信,就可以使用发送广播与接收广播的机制来实现.4,Activity与activity之间的转跳.转跳的实现方式还是使用Intent然后startActivity,当跳转的话是可以带数据过去的.

你可能感兴趣的:(组合,android,通信机制总结)