首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >人生巅峰的梦想之初!—Intent全解析

人生巅峰的梦想之初!—Intent全解析

作者头像
下码看花
发布于 2019-09-17 15:10:54
发布于 2019-09-17 15:10:54
9570
举报
文章被收录于专栏:AndroidStudio初识AndroidStudio初识

前言

Hi,新的征程开始啦,关于各种控件我们给大家介绍的已经差不多了,各位花粉已经陪伴着我们走过了一个阶段,本篇就是我们新征程的开始,当然,我们会在新征程之中偶尔穿插一些实战控件的使用,让大家学习的内容不再单一,还在等什么,紧跟我们的步伐,为了白富...理想而出发!!

简介

Intent作用

Intent 直译为 "意图",它用于在 Android 系统组件之间进行交互。它可被用来启动 Activity、发生信息到 BroadCastReciver,启动并与 service 进行交互。

Intent 分类
两种形式的Intent
  • 显示 Intent

显示 Intent 通过它的 setCompoent() 或 setClass() 来明确的指明要进行交互的组件,一般情况下不再会包含其他信息。

代码示例:

代码语言:javascript
复制
 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
 startActivity(intent);
  • 隐式 Intent

使用隐式 Intent 并没有明确的指定特定组件,而是指定足够的信息让 Android系统去决定哪一个组件是最符合 Intent 信息,从而拣选出最合适的组件。

隐式 Intent 一般在 Manifestfest.xml 给声明组件通过设置 Action、Data、Category 给与组件足够的信息,让系统筛选出合适的组件。

下面是给要启动的 Activity 在AndroidManifest.xml文件中设置:

代码语言:javascript
复制
  <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="abcdefg" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
   </activity>

我们修改 SecondActivity 在AndroidManifest.xml 中声明,在<intent-filter> 标签中声明 Intent 要过滤的信息。action 的 name 是一个字符串,可以自定义。

现在修改刚才在的 Activity 跳转代码如下:

代码语言:javascript
复制
  Intent intent = new Intent();
  intent.setAction("abcdefg");//与 Manifest 中组件声明的 action name 必须相同。
  startActivity(intent);

运行程序,点击跳转按钮仍然可以跳转到 SecondActivity 。

IntentStructure

事实上可以把 Intent 当做一个工具,用于绑定不同组件(甚至是不相同的应用程序之间)。程序在运行时通过 Intent 来延迟运行时绑定。最重要的用途就是启动 Activity,它可以被认为是 Activity 之间的粘合剂,而它本身是就是一个包含要执行动作的数据结构。

  • action :描述要被执行的动作。例如:Intent.ACTION_VIEW 用于显示用户的数据。比较通用,会根据用户的数据类型打开相应的Activity。 Uri uri = Uri.parse("http://www.google.com"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //打开浏览器 --> 浏览网页 Uri uri =Uri.parse("tel:1232333"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //打开拨号界面 --> 输入1232333号码 ....
  • category :给予额外的信息对于要执行的 action 。例如:
    • DEFAULT —— 默认动作
    • HOME —— 设置为本地桌面应用
    • LAUNCHER —— 应用的主 Activity
  • data :通常用来向 action 属性提供操作数据。data 属性默认接受一个 Uri 对象。
    • mimeType —— 用来设置该Data所指定的Uri对应的MIME类型,可自定义,只要符合abc/def格式即可。声明该组件所能匹配的Intent的Type属性。
    • scheme —— 用来声明该组件所能匹配的Intent的Data属性的scheme部分。
    • host —— 用来声明该组件所能匹配的Intent的Data属性的host部分。
    • port —— 用来声明该组件所能匹配的Intent的Data属性的port部分。
    • path —— 用来声明该组件所能匹配的Intent的Data属性的path部分。
    • pathPrefix —— 用来声明该组件所能匹配的Intent的Data属性的path前缀。
    • pathPattern —— 用来声明该组件所能匹配的Intent的Data属性的path字符串模版。

data子元素在配置的时候是可选的,但又是相互依存的,比如,如果没有配置scheme,那么其他所有的Uri属性都被忽略;如果host没有配置,那么port以及path,pathPrefix,pathPattern都会被忽略(不起作用)。

Intent 传递数据

在使用 Intent 进行执行操作时,可以通过给 Intent 绑定数据到另一个组件中,从而实现数据的传递。在这个过程中存在数据从内存序列化或从文件序列化。

代码语言:javascript
复制
 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
 intent.putExtra("Name","Android"); //Name --> key , Android --> value
 startActivity(intent);

数据的传递方式是以键值对的方式。

当跳转到SecondActivity 再从 Intent 中通过 key(键)把携带的数据取出。

代码语言:javascript
复制
   TextView textView = findViewById(R.id.tv_content);

        Intent intent = getIntent();//获取传递数据的 Intent
        String name = intent.getStringExtra("Name"); //通过 key 取出数据

        if (!name.isEmpty()) {
             //把界面上原来的字符串SecondActivity进行替换
            textView.setText(name);
        }

下面是通过源码查看的Intent所支持的传递数据类型。

Intent 返回数据到上一个界面

当使用 Intent 从 MainActivity 跳转到 SecondActivity ,当在关闭或返回 MainActivity 时需要从 SecondActivity 携带数据到 MainActivity。

这时,需要在启动 Activity 的时候使用 startActivityForResult(Intent intent, int requestCode) 方式启动。这个原理是当使用 startActivityForResult() 方式启动 Activity 时在返回时系统会回调 Activity 的 onActivityResult(int requestCode, int resultCode, Intent data) 方法。

注意这里有两个特殊的参数:

  • requestCode —— 请求码。使用请求码可以判断当多个Activity 启动同一个 Activity 时,确定是哪一个 Activity 启动的。
  • resultCode —— 响应码。使用响应码可以从上一个 Activity 中返回的多类型数据中,确定需要哪一种数据。

很明显返回的数据是包含在 onActivityResult(int requestCode, int resultCode, Intent data) 回调方法的 Intent 当中。

在 MainActivity 中重写回调方法获取从SecondActivity 中设置的数据通过 key。然后将原来界面上的文字 MainActivity 设置为从 SecondActivity 中取回的值。

在SecondActivity 中通过 setResult()方法设置数据,通过 Intent 对象。运行程序如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 前言
  • 简介
    • Intent作用
    • Intent 分类
    • Intent 传递数据
    • Intent 返回数据到上一个界面
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档