Intent进阶 和 Intent-filter 学习笔记

简介:

1,Intent的基础用法

Intent是android中各activity之间通信的一个很重要的类,一般我们是这么使用的

 
  1. //创建一个intent   
  2. Intent intent = new Intent();     
  3. //压值进intent中   
  4. //intent是基于一种基于Map的数据结构   
  5. //传我们的基本数据类型的可以之间key,value方式传值   
  6. intent.putExtra("hello","Hello world");     
  7. //但是,传一个对象的时要注意,该对象要实现序列化窗口才可以传值   
  8. //putExtra(String nameSerializable value)   
  9. Demo demo = new Demo();   
  10. intent.putExtra("Demo",demo);     
  11. //然后,我们把这个intent传到另外一个activity   
  12. intent.setClass(xxx.this,zzz.class);   
  13. startActivity(intent);     
  14. //-------   
  15. //目标activity   
  16. //获取传过来的intent Intent intent = getIntent();     
  17. //从Intent中获取值   
  18. String hello = intent.getStringExtra("Demo");   
  19. Demo demo = (Demo)intent.getSerializable("Demo");   
以上代码就是最基础的Intent的用法

2,深入Intent的构造和Intent-filter的基础入门

首先我们看下Intent的构造方法

 
  1. Intent()   
  2. //Create an empty intent.       
  3. Intent(Intent o)   
  4. //Copy constructor.       
  5. Intent(String action)   
  6. //Create an intent with a given action.       
  7. Intent(String action, Uri uri)   
  8. //Create an intent with a given action and for a given data url.       
  9. Intent(Context packageContext, Class<?> cls)   
  10. //Create an intent for a specific component.       
  11. Intent(String action, Uri uri, Context packageContext, Class<?> cls)   
  12. //Create an intent for a specific component with a specified action and data. 
出这些构造方法中我们,可以看出,新建一个Intent其实可以设置很多东西,这里我说说componentName,action,category,data

 

componentName

componentName 直译的话就是组件的名字的意思,如果我们写的一个类当作成一个组件,那么这个componentName就是用来封装我们写的这些类的位置.

 
  1. //创建一个component的对象   
  2. ComponentName componentName = new ComponentName(Context.this, xxx.class);     
  3. Intent intent  = new Intent();   
  4. Intent.setComponent(componentName);     
  5. startActivity(intent);     
  6. //----------   
  7. //在xxxactivity中   
  8. ComponentName comp = getIntent().getComponent();     
  9. String packageName = comp.getPackName();   
  10. String className = comp.getClassName(); 
其实细心的同学可以发现,其实跟setClass(),没什么区别吗,而且,还比setClass()麻烦,其实,setClass()是封装了这个功能而已,最实现还是要用到这个类.

Action,category,data简单入门

我感觉,学intent 和 intent-filter把action,category,data搞清楚才算真正的掌握了intent的用法.

Action

如果学过Structs2的同学应该不会陌生,所谓的action就是发送一个特定的请求,然后,由一个符合这个请求的activity响应

官方文档中是这么说action的:

The action largely determines how the rest of the intent is structured — particularly the data and extras fields — much as a method name determines a set of arguments and a return value. For this reason, it's a good idea to use action names that are as specific as possible, and to couple them tightly to the other fields of the intent. In other words, instead of defining an action in isolation, define an entire protocol for the Intent objects your components can handle.

我简要说下我理解的大义,有错欢迎指出

action 在很大一部分程度上决定你的intent 是如何构建的,特别是还有data,和 额外的一些字段,还有更多的是如何决定方法名,设置数组和返回的参数.由于这个原因,这是一个很好的方法去尽可能的具体的使用action,用action把这些字段紧密的联系在一起.另外,灵活定义你的action,然后把它定义在一个文档中为你的intent对象的组建能够正常处理

渣翻译…可能比谷歌翻译还有烂…有错欢迎指出!!!!!!!!!!!!!

category

要使一个action能够正常运行,category是必不可少的,关于category详细介绍请看开发者文档中的intent and intent-filter

这里说下注意的细节和使用.

首先,这句话是很重要的..取之于官方文档

Therefore, activities that are willing to receive implicit intents must include "android.intent.category.DEFAULT" in their intent filters.

这句话,告诉我们在intent-filter(可以用xml创建也可以用代码创建,这里主要讲xml的创建),必须添加一个android.intent.category.DEFAULT,至于,不添加会发生什么事…我花了半个小时的排错告诉我是无法运行的

 
  1. //在我们要运行的activity中添加   
  2. <activity android:name=".SecondActivity" android:label="second">                           <intent-filter >                                 
  3. <action android:name="kg.tom.TEST"/>                 
  4. <category android:name="   
  5. android.intent.category.DEFAULT " />               
  6. </intent-filter>           
  7. </activity>   
  8. //firstActivity   
  9. //在创建好的一个监听器里面方法中写上   
  10. Intent intent = new Intent();   
  11. intent.setAction("kg.tom.TEST");     
  12. //利用action来运行相应的activity startActivity(intent);   

注意:每个intent只能设置一个action,但是,可以设置多个category,这里的组合问题,自己好好想想吧.

data

因为就是一些参数的介绍,看官方文档就好了,我是这样理解这个DATA,例如,我们一个Mp3播放器,当我们在任务管理器中点击一个MP3文件,MP3这个文件就是一个data,就会触发我们,在intent-filter匹配这个Mp3,<data />的activity运行..

 


本文转自 liam2199 博客,原文链接:http://blog.51cto.com/youxilua/772705   如需转载请自行联系原作者

相关文章
|
7月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
439 0
|
4月前
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
87 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
7月前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
50 0
|
XML 存储 前端开发
Android:Intent 和 Intent 过滤器
在前 4 篇文章中,我们介绍了 Android 四大组件的基础知识,四大组件是构成我们 App 的基础,也是 Android 系统设计的最佳体现。各个组件之间完全是解耦的,如果想访问其他组件或者启动其他组件可以使用 Intent 来操作。在四种组件类型中,有三种(Activity、Service 和 Broadcast)均可以通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。所以我们可以把 Intent 当作是各个组件之间的信使(无论该组件是自己 App 的还是其他 App)。
140 0
Android:Intent 和 Intent 过滤器
|
Android开发
Intent的基本使用
显式Intent:通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class));每次启动的组件只有一个 隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时,会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件,当不止一个满足时,会弹出一个让我们选择启动哪个的对话框
|
安全 API Android开发
Android 面试题:说一下 PendingIntent 和 Intent 的区别
Android 面试题:说一下 PendingIntent 和 Intent 的区别
464 0
Android 面试题:说一下 PendingIntent 和 Intent 的区别
|
安全 Android开发 开发者
Android 13 针对 Intent filters 安全的再加强
Android 13 针对 Intent filters 安全的再加强
|
XML Java Android开发
|
XML Java Android开发
Intent的用法(1)
Intent的中文意思是目的,主要是用来在不同的Activity中跳转
Intent的用法(1)