Android学习笔记-Intent(一)

Intent对象在 Android官方API这样描述:It is a passive data structure holding an abstract description of an operation to be performed. 它是一种数据结构,抽象描述一次将要被执行的操作,其作用是在程序运行过程中连接两个不同的 组件
 
  Intent机制的引入,是实现Android应用程序的组件间通信的一种消息机制,它允许你在应用程序的组件间传递 Intent 来执行动作和产生事件,组件可以是跨应用程序间传递消息。Intent的设计目的也是为了减少Android应用程序的组件间的耦合。
 
  Intent可以理解为不同组件的通信媒介或者意图。Intent消息可以激活Android程序的三大核心组件:Activity,Service和BroadcastReceiver。
 
  Intent的用法如下:
 
  一.Intent在Activity中的应用:
 
      1.Intent的组成部分:
 
  Intent对象由以下六个部分组成:Component name、Action、Data、Category、Extras、Flags。
 
     2.Intent的示例:
 
  传递一个Intent对象到 Context.startActivity(intent) 或者 Activity.startActivity ForResult(int) 去运行一个Activity(可以在通过此方式启动后的Activity中调用 Activity.setResult() 设置结果参数,该参数将会在启动当前activity的activity中被接收---可以通过onActivityResult(int requestCode, int resultCode, Intent data) 接收)。
 
  a.无返回参数的示例:
 
  
 
 android.content.Intent  requestIntent = 
 new android.content.Intent(OrginalActivity.class, DestinationActivity.class); 
 startActivity(requestIntent);
     b.有返回参数的示例:
 
复制代码
 public class OrginalActivity  extends Activity { 
 public void onCreate(Bundle saveInstanceState) { 
    super.onCreate(saveInstanceState); 
    final android.content.Intent  requestIntent = 
    new android.content.Intent(OrginalActivity.class, DestinationActivity.class); 
    findViewById(R.id.button).setOnClickListener ( 
        new OnClickListener() { 
            public void onClick(View v) { 
                startActivityForResult(requestIntent, RequestCode); 
            } 
        } 
    ); 
 } 
 
 protected void onActivityResult(int requestCode, int resultCode,Intent intent) { 
    if (requestCode == RequestCode && resultCode == ResultCode ) { 
        Bundle ret = intent.getExtras(); 
        If (ret!=null) { 
            TextView textView = (TextView) findViewById(R.id.textView01); 
            textView.setText(ret.getString(“key”)); 
        } 
    } 
    else { 
        // 其他条件的执行代码
    } 
 } 
 }  // end of class definition 
 
 Public class DestinationActivity extends Activity { 
 public void onCreate(Bundle saveInstanceState) { 
    super.onCreate(saveInstanceState); 
    findViewById(R.id.button1).setOnClickListener ( 
        new OnClickListener() { 
            public void onClick(View v) { 
                android.content.Intent  resultIntent = new android.content.Intent(); 
                resultIntent.putExtras(“key”, “values”); 
                setResult(ResultCode,resultIntent); 
                finish();
            } 
        } 
    ); 
 } 
 }
复制代码
3.Intent-Action
 
  指明一个意图的动作,通常Action分为 系统定义Action和自定义Action.
 
     a.Intent里面定义的Action常量为系统Action如下:
 
  
 
   b.自定义Action可以如下所示:
 
  
 
复制代码
<activity android:name=".OrginalActivity">  
       <intent-filter>  
            <action android:name="selectAction"/>  
            <category android:name="android.intent.category.DEFAULT" />  
       </intent-filter>  
   </activity>          
复制代码
  c.补充:android.intent.action.MAIN的意义
 
  android.intent.action.MAIN标记了启动Application时先启动那个Activity,若有多个android.intent.action.MAIN,则先启动mainfest里面第一个出现的android.intent.action.MAIN。如果mainfest文件里注册的有多个Activity都有<Intent Filters>标签,指定 action android:name="android.intent.action.MAIN",则系统默认启动Activity列表中从上到下第一个Activtiy.
 
4.Intent Resolution(解析意图)
 
  在我们的应用程序内,我们需要在一个Activity跳转到另外一个Activity的时候,我们会通过封送Intent消息,我们在Action中指明跳转的Activity的包名+类名,我们可以实现到另外一个Activity的跳转。这个时候的Activity之间的跳转,我们封送的Intent就是显式意图(explicit intent)。所以,显示意图一般在应用程序内使用。
 
  我们还会有这样一种情况,我们不知道我们要跳转的Activity组件的具体名称,也就是我们没有一个明确的Activity来处理我们的动作,我们只是知道我们需要处理我们动作的Activity需要满足什么条件,android系统必须找到最适合的组件去处理这个intent。这个时候,我们的Intent意图所指定的筛选条件,会去筛选在我们的Android系统所有注册的满足条件的Activity,然后,通常会让我们去选择我们需要用哪个Activity去处理我们的动作。这种情况下我们封送的Intent就是隐式意图(implicit Intent)。在此我们引出Intent Filters 来解释我们的意图过滤过程。
 
5.Intent Filters
 
  IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。 IntentFilter实行“白名单”管理,即只列出组件乐意接受的Intent,但IntentFilter只会过滤隐式Intent,显式的Intent会直接传送到目标组件。 Android组件可以有一个或多个IntentFilter,每个IntentFilter之间相互独立,只需要其中一个验证通过则可。除了用于过滤广播的IntentFilter可以在代码中创建外,其他的IntentFilter必须在AndroidManifest.xml文件中进行声明。IntentFilter中具有和Intent对应的用于过滤Action,Data和Category的字段。
 
  a.一个Intent对象只能设置一个Action,但是一个Activity的IntentFilter可以有多个Action。封送的Intent消息只要满足其中一个Action,就可以满足条件。如果Intent 消息没有包含具体的 action 行为定义,只要过滤器规则中定义一条 action 行为描述,则该过滤器匹配 Intent 消息;
 
     b.Intent 消息没有包含任何 URI 数据或者具体数据内容的信息,仅能匹配不包含任何数据过滤信息的过滤器;Intent 中没有提供数据类型,系统将从数据中推算数据类型。Intent 消息中推算的数据类型如果包含在过滤器规则中声明的数据类型列表时,该消息匹配该过滤器,否则该消息将会被过滤器过滤.
 
  如果一个Intent对象包含数据类型,但不包含URI:仅当Intentfilter也没指定URL,而只包含数据类型且与Intent相同,才通过检测。 如果一个Intent对象既包含URI,也包含数据类型(或数据类型能够从URI推断出),只有当其数据类型匹配Intentfilter中的数据类型,并且通过了URL检查时,该Intent对象才能通过检查。
 
   其中URL由四部分组成:它有四个属性scheme、host、port、path对应于URI的每个部分。
 
       例如:content://com.wjr.example1:121/files
 
       scheme部分:content
 
       host部分:com.wjr.example1
 
       port部分:121
 
       path部分:files
 
    host和port部分一起构成URI的凭据(authority),如果host没有指定,那port也会被忽略。
 
    这四个属性是可选的,但他们之间并不是完全独立的。要让authority有意义,scheme必须要指定。要让path有意思,scheme和authority必须指定。 Intentfilter中的path可以使用通配符来匹配path字段,Intent和Intentfilter都可以用通配符来指定MIME类型。
 
     c.Intentfilter中可以设置多个Category,Intent中也可以含有多个Category,只有Intent中的所有Category都能匹配到Intentfilter中的Category,Intent才能通过检查。也就是说,如果Intent中的Category集合是Intentfilter中Category的集合的子集时,Intent才能通过检查。如果Intent中没有设置Category,则它能通过所有Intentfilter的Category检查。 如果一个Intent能够通过不止一个组件的Intentfilter,用户可能会被问那个组件被激活。如果没有目标找到,会产生一个异常。
 
  总结一下,应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。每个 IntentFilter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值