android组件通讯 Intent Filter隐式实现Intent

简介:

Intent Filter是android里非常有特色的一个概念。他的用户体验和windows下的文件管理器的弹出菜单里的“打开方式”非常相似。在windows中,当用户选择了打开方式菜单后,系统让用户选择应用来打开所选择的文件。而在android中的文件已经被uri资源代替了。 

Intent Filter在android中的应用非常普遍,尤其在资源共享中。例如,当用户选择了一个图片,选择了共享,我们常常会发现一个选择列表。这个选择列表是动态生成的,不是一成不变的。假如你新安装了facebook应用,那么facebook就会出现在这个列表里面。从这个例子可以发现,intent filter的设计使得android系统显得更加灵活了。 

要实现一个Intent Filter, 我们要在AndroidManifest.xml中加入必要的设置,以通知系统某个activity都能够处理什么类型的URI资源,然后要在activity的onCreate中加入必要的代码以处理系统传递过来rui资源。

 

一个Service、 Activity 或者 Brodcast Reciever 的Intent Filter , 的事件过滤器, 我们用着大家都很了然的说法来描述之吧, 实际上描述了拥有这些过滤器组建在系统中所具有能力。

Filter 的创建都是通过 manifest.xml 文件, 但是对于 Broadcast Reciever 用 Context.registerReceiver() 来创建。Filter 可以包含三种类型的过滤条件 <action> <category> <data>

一个Intent 是否能够通过一个过滤器到达对应的处理器取决于, Intent 所包含的 所有Categroy 是够都在 过滤器中的catergory 列表里出现。 换句话说, 没有 catergory字段的Inteng 可以通过任何过滤器, 而一个过滤器, 必须至少要有一个可以通过的限定,Category 或者 Action。 对于Action 也一样, 能够通过Filter 的Itent的 Action 必须被列与 Category中。同样, 没有Action 的Intent 也可以通过所有的Filter。

对于 <data> 过滤条件稍微复杂点, 但是总的原则还是, 只有Intent 能够通过 Filter, 那么Intent 中的信息,必须出现在Filter中。 <data> 需要指定 scheme://host:port/path , 条件顺序的优先级随着范围缩小而降低,相当于,看作目录,在子目录下匹配。 比如, Filter指定了 scheme, 那么所有具有这个 scheme 的 Intent 都能通过,这个Filter, 类似的通配符的情况也是允许的。

这里翻译文档中的四个例子情况:

a.如果没有定义URI 和数据类型, 则,该Intent只能通过没有定义URI和 数据类型的 过滤器。

b.只定义了URI的 Intent 只能通过只定义了 URI 的过滤器。

c.只定义了 数据类型的 Intent 也只能通过只定义了 数据类型的过滤器。

d. 如果一个Intent同事定义了URI和 数据类型, 或者数据类型可以由URI推定, 则只有具备了对应的数据类型,或者 content: 或者 file: 类型,并且没有定义URI的过滤器。(这种情况, 你自己代码一下就明白了, 在写下去,我也不鸟鸟了。)

如果通向Activities 的Intent 引起了多个响应, 就会出现需要用户指定的提示, 或者是异常。

 

差不多就是这样的情况了, android 的这种机制非常适合移动设备之间的应用相互调用, 以便在更大的粒度上达成复用。很强大。

 

/Chapter06_Intent_Filter/src/com/amaker/ch06/app/MainActivity.java

 

 
  1. 代码  
  2.  
  3. package com.amaker.ch06.app;  
  4.  
  5. import com.amaker.ch06.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. /**  
  15.  *   
  16.  * Intent Filter 测试  
  17.  */ 
  18. public class MainActivity extends Activity {  
  19.     // 声明Button  
  20.     private Button btn;  
  21.     private static final String ACTION1 = "com.amaker.ch06.app.TEST_ACTION1";  
  22.     private static final String ACTION2 = "com.amaker.ch06.app.TEST_ACTION2";  
  23.     private static final String ACTION3 = "com.amaker.ch06.app.TEST_ACTION3";  
  24.       
  25.     private static final String CATEGORY1 = "com.amaker.ch06.app.CATEGORY1";  
  26.     @Override 
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         // 设置内容布局  
  30.         setContentView(R.layout.main);  
  31.         //实例化按钮  
  32.         btn = (Button)findViewById(R.id.Button01);  
  33.           
  34.         String a = Intent.ACTION_VIEW;  
  35.         // 添加单击监听器  
  36.         btn.setOnClickListener(new OnClickListener() {  
  37.             @Override 
  38.             public void onClick(View view) {  
  39.                   Intent intent = new Intent();  
  40.                   //intent.setAction(ACTION1);  
  41.                   //Uri data = Uri.parse("content://com.amaker.ch07.app/abc");  
  42.                   //intent.setData(data);  
  43.                     
  44.                   intent.addCategory(CATEGORY1);  
  45.                     
  46.                   intent.setAction("android.intent.action.VIEW");  
  47.                   intent.setData(Uri.parse("http://www.google.com"));  
  48.                     
  49.                   startActivity(intent);  
  50.             }  
  51.         });  
  52.     }  

/Chapter06_Intent_Filter/src/com/amaker/ch06/app/TestActivity.java

 

 
  1. 代码  
  2.  
  3. package com.amaker.ch06.app;  
  4.  
  5. import com.amaker.ch06.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. /**  
  10.  * 测试Intent Filter  
  11.  */ 
  12. public class TestActivity extends Activity {  
  13.     @Override 
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main1);  
  17.     }  

/Chapter06_Intent_Filter/res/layout/main.xml

 

 
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     > 
  9.     <Button   
  10.         android:text="测试Intent Filter"   
  11.         android:id="@+id/Button01"   
  12.         android:layout_width="wrap_content"   
  13.         android:layout_height="wrap_content"></Button> 
  14. </LinearLayout> 

/Chapter06_Intent_Filter/res/layout/main1.xml

 

 
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     > 
  9.  
  10.     <TextView   
  11.         android:text="测试Intent Filter"   
  12.         android:id="@+id/TextView01"   
  13.         android:layout_width="wrap_content"   
  14.         android:layout_height="wrap_content"></TextView> 
  15.  
  16. </LinearLayout> 

/Chapter06_Intent_Filter/AndroidManifest.xml

 

 
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  5.       package="com.amaker.ch06.app" 
  6.       android:versionCode="1" 
  7.       android:versionName="1.0"> 
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.           
  17.         <activity android:name="TestActivity" > 
  18.             <intent-filter> 
  19.                 <action android:name="com.amaker.ch06.app.TEST_ACTION1"/> 
  20.                 <action android:name="com.amaker.ch06.app.TEST_ACTION2"/> 
  21.                 <action android:name="com.amaker.ch06.app.TEST_ACTION3"/> 
  22.                   
  23.                 <action android:name="android.intent.action.VIEW"/> 
  24.                   
  25.                   
  26.                 <data android:scheme="content" android:path="com.amaker.ch07.app/abc"/> 
  27.                 <data android:scheme="http" android:path="www.google.com" /> 
  28.                   
  29.                 <category android:name="android.intent.category.DEFAULT"/> 
  30.                 <category android:name="android.intent.category.BROWSABLE" /> 
  31.                 <category  android:name="com.amaker.ch07.app.CATEGORY1"/> 
  32.                   
  33.             </intent-filter> 
  34.         </activity> 
  35.           
  36.     </application> 
  37.     <uses-sdk android:minSdkVersion="3" /> 
  38.  
  39. </manifest> 

 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1080659


相关文章
|
8天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
85 0
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
44 6
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
188 5
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
68 0
|
Java Android开发
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
135 1
下一篇
无影云桌面