文章目录

  • Intent
  • 显式 Intent
    • 定义两个 xml 文件
      • android:orientation
      • match_parent 和 wrap_content
    • Intent函数
    • 定义两个 Activity
  • 隐式 Intent
  • 更多隐式 Intent 的用法
    • 用隐式 Intent 打开系统浏览器
    • 自建 Activity 以响应打开网页的 Intent
    • 向下一个活动传递数据
    • 返回数据给上一个活动

Intent

如何在切换 Actiity 时携带数据是一个重要问题。我们定义两个 xml 文件,通过 Intent 实现在活动间跳转。

什么是 xml 文件?

xml 即可扩展标记语言,是互联网数据传输的重要工具,它可以跨越互联网任何的平台,在服务器之间穿梭结构化数据,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。

xml 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。xml 是标准通用标记语言(SGML)的子集,非常适合 Web 传输。

Inten启动组件的方法:

组件名称 方法名称
Activity startActvity()
startActivity()
Service startService()
bindService()
Broadcasts sendBroadcasts()
sendOrderedBroadcasts()
sendStickyBroadcasts()

显式 Intent

定义两个 xml 文件

定义一个 first_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击有惊喜~"></Button></LinearLayout>

定义一个 second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SecondActivity"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:id="@+id/button_2"android:text="再点一次~"></Button></LinearLayout>

android:orientation

orientation 定义了页面组件排列方式是垂直(vertical)还是水平(horizontal)。

match_parent 和 wrap_content

Android 中所有的控件都具有 layout_widthlayout_height 这两个属性,可选值有3种:match_parentfill_parentwrap_content

其中 match_parentfill_parent 的意义相同,但官方更推荐 match_parent

  • match_parent 表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。
  • wrap_content 表示让当前的控件大小能够刚好包含里面的内容,也就是由控件内容决定当前控件的大小。

Intent函数


Intent 函数接收两个参数:

  • 第一个参数 Context 为上下文,一般使用 this 即可。
  • 第二个参数为要启动的目标 Activity

函数内部调用了 ComponentName 函数,该函数可以启动其他应用的 Activity、Service:

  • pkg: Activity、Service 所在应用的包名。
  • cls: Activity、Service 的包名+类名。

定义两个 Activity

MainActivity

package com.example.intent_test;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.first_layout);Button button1 = (Button)this.findViewById(R.id.button_1);button1.setOnClickListener((View view)->{// 显式IntentIntent intent = new Intent(this, SecondActivity.class);this.startActivity(intent);});}
}

SecondActivity

package com.example.intent_test;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.second_layout);Button button2 = (Button)this.findViewById(R.id.button_2);button2.setOnClickListener((View view)->{// 显式IntentIntent intent = new Intent(this, MainActivity.class);this.startActivity(intent);});}
}

定义两个 Activity 之后,我尝试运行时曾出现报错,原因是修改 AndroidManifest.xml 文件时不小心删了一段配置代码……所以说还是能不碰 AndroidManifest.xml 就不碰它(对于新手而言),如果有同学也出现报错,可以参考一下我的 AndroidManifest.xml ,检查一下自己的是否有问题:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.intent_test"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Intenttest"><activity android:name=".SecondActivity"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

运行结果:

运行 MainActivity

点击之后跳转:

点击再点一次后回跳回图一。


隐式 Intent

AndroidManifest.xml 中修改 .SecondActivityactivity 属性:

action 标签指定当前活动可以响应 com.example.activitytest.ACTION_START 这个活动,而 category 标签包含一些附加信息,表明只有在 actioncategory 中的内容同时匹配上 Intent 的内容的时候,SecondActivity 才可以响应 Intent

first_layout.xml 中添加第二个按钮,(因为 Android 布局界面和业务逻辑分离,因此本质上是在 MainActivity 的页面布局上添加 button3):

MainActivity 中为 button3 绑定 隐式Intent

即使不为 Intent 指定 category 标签(未调用 addCategory()),它也会在调用 startActivity() 方法时自动添加默认的 category(即 android.intent.category.DEFAULT)。

每个 Intent 中只能指定一个 action,但却能指定多个 categoryo 。

运行结果:


更多隐式 Intent 的用法

用隐式 Intent 打开系统浏览器


指定 Intent.ACTION_VIEWaction,这是一个 Android 统内置的动作,常量值为 android.intent.action.VIEW,然后通过 Uri.parse 方法,解析网址成一个 Uri 对象,调用 setDate 将其传递进去。

setData 方法可以接受一个 Uri 对象,指定当前 Intent 正在操作的数据。通常数据都是以字符串的形式传入到 Uri.parse 方法中解析产生。


自建 Activity 以响应打开网页的 Intent

与之对应,我们可以在 <intent-filter> 标签中再配置一个 <data> 标签,用于更加精确地指定当前活动能够响应什么类型的数据。下面是 <data> 标签中可以配置的内容:

android:scheme
//用于指定数据的协议部分,如http
android:host
//用于指定数据的主机名部分,如www.baidu.com
android:port
//用于指定数据的端口部分,一般跟随在主机名后
android:path
//用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType
//用于指定可以处理的数据类型,允许使用通配符的方式进行指定

新建 ThirdActivity ,无需添加多余代码,默认样式即可:

重点在于修改 AndroidManifest.xmlThirdActivity 的配置:

Intent 只有一个 action 标签,但可以有多个 category 标签。

<action android:name="android.intent.action.VIEW" />

出现该 action 标签必须配置下面的 category 标签,否则会报错:

<category android:name="android.intent.category.BROWSABLE" />

android:scheme 的值由被打开网页的 Url 决定:

<data android:scheme="http" />

运行结果:


但实际上通过自定义的 Activity 打开是没有任何内容的,因为我们没有配置相应的 xml 布局也没有丰富 ThirdActivity 的逻辑代码:


向下一个活动传递数据

两个 Activity 之间传递数据也是使用 Intent,通过 putExtra() 方法的重载,可以把我们想要传递的数据暂存在 Intent 中,启动了另一个活动之后,只需要把这些数据再从 Intent 中取出就可以了。

  • Intent.putExtra(String name, @Nullable String value) : 向 Intent 中写入数据。
  • Intent.getxxxExtra: 向 Intent 中取得数据。

MainActivity 中有一个字符串,现在想把它传递到下一个活动当中:

然后在 SecondActivity 中取出数据:

  • 首先通过 getIntent 方法获取到用于启动 SecondActivityIntent
  • 然后调用 getStringExtra 方法,传入相应的键值(即消息的名称),就可以得到相应的数据了;
  • Log.d 用于打印日志以便于寻找 bug
  • .show() 用于显示 Toast 信息。

Toast.makeText 是 Andriod 的消息模式:

  • context:当前的上下文环境。可用 getApplicationContext()this
  • text:要显示的字符串。也可是 R.string字符串ID
  • duration:显示的时间长短。Toast 默认的有两个 LENGTH_LONGLENGTH_SHORT,也可以使用毫秒如 2000ms。

运行结果:


返回数据给上一个活动

SecondActivity 中构建一个 Intent 用于传递数据,然后调用了 setResult 方法,这个方法专用于向上一个活动返回数据,它有两个参数:

public final void setResult(int resultCode, Intent data) {synchronized (this) {mResultCode = resultCode;mResultData = data;}
}
  • resultCode:用于向上一个活动返回处理结果,一般只用 RESULT_OK 或者 RESULT_CANCELED 这两个值;
  • data:将带有数据的 Intent 传递回去。


通过 finish() 方法来销毁活动,也可以使用回退键销毁活动,但要重写一下 onBackPressed 方法:

接下来实现对 MainActivity 的编写:

Activity 中有 startActivityFroResult 方法,也是用于启动活动的,且在活动销毁时返回一个结果给上一个活动。该方法接受两个参数:

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {startActivityForResult(intent, requestCode, null);
}
  • Intent: 启动的 Activity;
  • requestCode: 请求码,用于在之后的回调中判断数据来源。


startActivityForResult 方法在 SecondActivity 活动销毁之后会回调 MainActivity 活动的 onActivityResult 方法,因此需要在 MainActivity 中重写来得到返回的数据。onActivityResult 方法有三个参数:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {}
  • 请求码 requestCode:就是 startActivityForResult 中传入的 int 值;
  • resultCode:返回数据时传入的处理结果;
  • data:携带着返回数据的 Intent

运行结果:

Android 入门(四) | Intent 实现 Activity 切换相关推荐

  1. Android 5.1系统手机Activity切换透明可以看到桌面

    Android 5.1系统手机Activity切换透明可以看到桌面 需要解决的问题 我们在开发时,在部分手机中进行Activity跳转,我们会先看到该手机的桌面然后才会看到我们需要跳转的Activit ...

  2. Android入门(四)——页面跳转

    目录 一.如何创建多个页面 二.如何进行页面跳转 1.传递参数方式一 2.传递参数方式二(传递多个参数) 三.设置页面自动跳转(用到线程) 四.Activity生命周期 一.如何创建多个页面 一个ac ...

  3. Android中使用Intent进行窗体切换,并且传值和自定义类的对象详解

    在Android中,Intent对象负责各个Activity窗口之间的切换,同时他更担负起数据传输重任. 一般情况下,使用Intent对象进行简单窗口切换的代码如下: Intent i=new Int ...

  4. [android] 练习样式主题自定义activity切换动画

    主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画 anim/fade_in.xml <?xml version="1.0" en ...

  5. Android入门(五) | Activity 的生命周期

    文章目录 Activity 的状态及生命周期 实现管理生命周期 FirstActivity SecondActivity DialogActivity 运行结果 旧活动被回收了还能返回吗? Activ ...

  6. Android 入门之Intent应用

    1.显示Intent Intent intent=new Intent(RequestActivity.this,ResultActivity.class); startActivity(intent ...

  7. Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

    文章目录 Activity 的启动模式 standard singleTop singleTask singleInstance 技巧 了解当前界面是哪个 Activity 随时随地退出程序 启动活动 ...

  8. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  9. Android入门篇(四):自动拨打电话、手动拨打电话

    Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...

最新文章

  1. Python Multiprocessing with PyCUDA
  2. HDU 2202 计算几何
  3. python __future__ 的几种特性
  4. 2020 年热门编程语言的发展方向
  5. MiniDao Framework 1.3.0 发布,J2EE持久化解决方案
  6. iOS 14.5新功能:解锁iPhone更方便!
  7. 6月14日Linux设备驱动开发免费讲座PPT
  8. HTML5在线编辑器Wysihtml5之Bootstrap扩展
  9. 手动杀毒,SOLA病毒(也称之为worm.script.bat.Agent、Trojan.Win32.Sola病毒)
  10. flash视频的param属性解释
  11. MTK最新工具(刷机,写号,升级等)合集含工具源码
  12. 案例推荐《微博:随时随地迎战大流量》
  13. 柳传志二十年驭人成就柳氏联想
  14. 提高多表关联数据查询效率
  15. Python字符串地常规操作:取值,切片,查找,替换,分割,拼接,转义
  16. HyperX Alloy Mars2游戏机械键盘,深耕专业电竞机游戏械键盘
  17. 中型研发组织管理之--选择人
  18. tws蓝牙耳机哪个牌子好?2022蓝牙耳机排行榜
  19. js 你知道为什么[]==![]是成立的吗(强制类型转换)
  20. 2021最稳C/C++学习路线

热门文章

  1. mysql获取当前时间毫秒_MySQL性能指标及计算方法
  2. 零基础Unreal Engine 4(UE4)图文笔记之粒子系统
  3. 详细js读取execl内容并展示
  4. 【转】Net Framework,Net Core 和 Net Standard 区别
  5. libc.so.6linux查找,Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17' not found 的解决办法...
  6. vs c语言 多线程demo,一个多线程的Socket通信Demo(C语言实现)
  7. python需要配置环境变量吗_python需要设置哪些环境变量?我只知道一个PYTHONHOME指向安装目录。(python详细安装教程 path)...
  8. 【Python学习】 - 手写数字识别 - python读入mnist数据集的多种方法
  9. 【POJ - 3159】Candies (差分约束,卡SPFA)
  10. 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)