前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Intent详解

Intent详解

作者头像
Twcat_tree
发布2022-11-30 17:42:02
6760
发布2022-11-30 17:42:02
举报
文章被收录于专栏:二猫の家

    Intent,中文名为意图,简单说也就是传递消息。Intent是各个组件之间信息沟通的桥梁。

既能在Activity之间沟通,又能在Activity和Service之间沟通,也能在Activity和Broadcast之间沟通。总结为:Intent用于处理Android各组件之间的通信,工作有:

  1.     Intent需标明本次通信请求从哪里来、到哪里去、怎么走。
  2.     发起方携带本次通信需要的数据内容,接收方对收到的Intent数据进行解包。
  3.     如果发起方要求判断接收方的处理结果,Intent就要负责让接收方传回应答的数据内容。

元素名称

设置方法

说明与用途

Component

setComponent

组件,用于指定Intent的来源与目的

Action

setAction

动作,用于指定Intent的操作行为

Data

setData

即Uri,用于指定动作要操纵的数据路径

Category

setCategory

类别,用于指定Intent的操作类别

Type

setType

数据类型,用于指定Data类型的定义

Extras

setExtras

扩展信息,用于指定装载的参数信息

Flags

setFlags

b标志位,用于指定Intent的运行模式(启动标志)

    表达Intent来往路径分为:显示Intent和隐式Intent。

  • 显示Intent,直接指定来源类与目标类名,属于精确匹配。

              在声明一个Intent对象时,需要指定两个参数,第一个参数表示跳转的来源页面,第二个参数表示接下来要跳转到的页面类。具体的生命方式有以下三种:

               (1)在构造函数中指定:

                        Intent intent = new Intent(this,ActResponseActivity.class);

               (2)调用setClass方法指定:

                        Intent intent = new Intent();                         intent.setClass(this,ActResponseActivity.class);

               (3)调用setComponent方法指定:

                        Intent intent = new Intent();                         ComponentName component = new ComponentName(this,ActResponseActivity.class);                         intent.setComponent(component);

  • 隐式Intent,没有明确指定要跳转的类名,只给出一个动作让系统匹配拥有相同字串定义的目标,属于模糊匹配。

定义好的动作名称是一个字符串, 可以是自己定义的动作,也可以是已有的系统动作。

Intent类的系统动作常量名

系统动作的常量值

说明

ACTION_MAIN

android.intent.action.MAIN

App启动时的入口

ACTION_VIEW

android.intent.action.VIEW

显示数据给用户

ACTION_EDIT

android.intent.action.EDIT

显示可编辑的数据

ACTION_CALL

android.intent.actionCALL

拨号

ACTION_DIAL

android.intent.action.DIAL

打电话

ACTION_SEND

android.intent.action.SEND

发短信

ACTION_ANSWER

android.intent.action.ANSWER

接电话

ACTION_SEARCH

android.intent.action.SEARCH

导航栏上SearchView的搜索动作

              这个动作名称通过setAction方法来指定,也可以通过构造函数Intent(String action)直接生成Intent对象。

             当然,由于动作是模糊匹配,因此有时需要更详细的路径,比如知道某人住在哪个小区,并无法直接找到他家,还得说明他住在该小区的哪一期、哪号楼、哪一层、哪一个单元。Uri和Category便是这样的路径与门类信息,Uri数据可通过构造函数Intent(String action,Uri uri)在生成对象时一起指定,也可通过setData【setUri】方法指定;Category可通过addCategory方法指定,之所以用add而不用set方法,是因为一个Intent可同时设置多个Category,一起进行过滤。

             调用系统拨号程序的例子,其中就用到了Uri:

                     Intent intent = new Intent();                      intent.setAction(Intent.ACTION_CALL);                      Uri uri = Uri.parse("tel:"+"15960238696");                      intent.setData(uri);                      startActivity(intent);

            隐式Intent用到过滤器的概念,把不符合匹配条件过滤掉。剩下符合条件的优先顺序调用,其中创建一个Android工程,AndroidManifest.xml里的intent-filter就是XML中的过滤器。我们最常见的主页面MainActivity的activity节点下面设置了action和category过滤条件。其中,android.intent.action.MAIN表示App的入口动作,android.intent.category.LAUNCHER表示在App启动时调用。

  • 向下一个Activity传递参数

        Bundle内部用于存放数据的实质结构是Map映射,可添加元素、删除元素,还可以判断元素是否存在。把Bundle全部打包好只需调用一次putExtras方法,把Bundle全部取出来也只需调用一次getExtras方法。

        下面是前一个页面向后一个页面发送请求数据的代码:

               Intent intent = new Intent(MainActivity.this,FirstActivity.class);

               Bundle bundle = new Bundle();

               bundle.putString("name","张三");

               bundle.putInt("age","30");

               bundle.putDouble("height","170.0f");

               intent.putExtras(bundle);

               startActivity(intent);

        下面是后一个页面接收前一个页面请求数据的代码:

               Intent intent = getIntent();

               Bundle bundle = intent.getExtras();

               String name = bundle.getString("name","");

               int age = bundle.getInt("age",0);

               double height = bundle.getDouble("height",0.0f);

  • 向上一个Activity返回参数

        Intent有时只需要把请求数据发送到下一个页面就行,但有时还要处理下一个页面的应答数据(通常发生在下一个页面返回到上一个页面时)。如果只把请求数据发送到下一个页面,前一个页面调用startActivity方法就可以;如果还要处理下个页面的应答数据,需要进行分步操作,详细步骤如下:

1.  前一个页面打包好请求数据,调用方法startActivityForResult(Intent intent,int requestCode),表示需要处理结果数据,第二个参数表示请求编号,用于标识每次请求的唯一性。

2.  后一个页面接收请求数据,进行相应处理。

3. 后一个页面在返回前一个页面时,打包应答数据并调用setResult方法返回信息。setResult的第一个参数表示应答代码,代码如下:

              Intent intent = new Intent();

              Bundle bundle = new Bundle();

              bundle.putString("job","码农");

              intent.putExtras(bundle);

              setResult(Activity.RESULT_OK,intent);

              finish();//表示关闭当前页面

4.  前一个页面重写方法onActivityResult,该方法的输入参数包含请求编号和应答代码,请求编号用于判断对应哪次请求,应答代码用于判断后一个页面是否处理成功。然后对应答数据进行解包处理,代码示例如下:

              @Override

              public void onActivityResult(int requestCode,int resultCode,Intent intent){

              //请求码和应答码

              Log.d("TAG","onActivityResult.requestCode=" + requestCode + ",resultCode="+resultCode);

              Bundle resp = intent.getExtras();

              String job = resp.getString("job");

              Toast.makeText(this,"您目前的职业是"+job,Toast.LENGTH_LONG).show();

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档