【Android】活动之间的穿梭

引入

在活动的初学建立了一个简单的活动,但只有一个活动不是过于简单,在你使用手机的时候按下一个按钮可能会跳转到下一个界面,此时就是活动之间的穿梭:使用Intent在活动之间穿梭

Intent:是android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。大致可分为显式Intent隐式Intent

使用显式Intent

Intent有多个构造函数的重载,其中一个为Intent(Context packageContext, Class<?> cls):第一个参数Context要求提供一个启动活动的上下文,第二个参数Class即为指定想要启动的目标活动,通过这个构造就可以直接告诉Intent的意图

在使用之前我们先创建了两个活动,第一个主活动有一个按钮Button1,第二个活动有一个按钮Button2,我们需要按下第一个按钮使其跳转到第二个活动

activity_main.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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/Button_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button1"/></LinearLayout>

activity_second.xml:

<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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".SecondActivity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/Button_2"android:text="Button 2"/></LinearLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.ActivityTest"tools:targetApi="31"><activityandroid:name=".SecondActivity"android:exported="false" /><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

在主活动下写下按下Button1按钮带来的事件,代码如下:

Button button1 = (Button) findViewById(R.id.Button_1);
//按下Button1按钮使其跳转到第二个活动界面
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);}
});

即可完成上述要求,在第一个活动页面按下Button1则会跳转到第二个活动界面,此时按下back按钮就可以销毁第二个活动,返回到主活动

使用隐式Intent

隐式Intent:并不明确指出我们想要重启哪一个活动,而是指出一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动(就是可以响应我们这个隐式Intent的活动)去启动

  1. 此时我们需要修改AndroidManifest.xml中的代码,在第二个活动部分修改
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.ActivityTest"tools:targetApi="31"><!--是否能被其他应用访问:android:exported="false"--><activityandroid:name=".SecondActivity"android:exported="false" ><intent-filter><action android:name="com.example.activitytest.ACTION_START"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
<action android:name="com.example.activitytest.ACTION_START"/>:这个标签声明了一个特定的动作,即ACTION_START。这个动作是自定义的,由com.example.activitytest这个命名空间限定。这意味着只有当Intent包含这个特定的动作时,配置了这个<intent-filter>的组件才会被触发,就会自动触发这个活动
<category android:name="android.intent.category.DEFAULT"/>:这个标签声明了Intent所属的类别。这里的是一种默认的category,在调用 startActivity()方法的时候会自动将其添加到Intent中。
  1. 修改主活动下按钮的点击事件:
Button button1 = (Button) findViewById(R.id.Button_1);
//按下Button1按钮使其跳转到第二个活动界面:隐式Intent,即根据action与category的同时匹配确定所要进入的活动
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.activitytest.ACTION_START");startActivity(intent);}
});

我们使用的是另外一个Intent的构造函数,将action字符串直接传了进去,表明我们所要响应的活动。注意一个Intent只能指定一个action,但是可以指定多个category

指定多个category(以加入了android.intent.category.MY_DEFAULT为例):

主活动代码修改:

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.activitytest.ACTION_START");intent.addCategory("android.intent.category.MY_DEFAULT");startActivity(intent);
});

修改AndroidManifest.xml中的代码:

<activityandroid:name=".SecondActivity"android:exported="false" ><intent-filter><action android:name="com.example.activitytest.ACTION_START"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.MY_DEFAULT"/></intent-filter>
</activity>

带来的效果仍为按下第一个按钮会跳转到第二个活动,但是与上一个不同在于,上一个是在按钮中直接声明要跳转到第二个活动,而这个是根据AndroidManifest.xml活动中的标签声明来确定到底是哪个活动,必需要将所有的标签声明匹配完毕,才可跳转到对应界面

更多隐式Intent的用法

使用隐式Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这就为Android多个应用程序之间的功能共享成为了可能

  1. 修改主活动的代码,使其跳转到指定的页面(百度):
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://baidu.com"));startActivity(intent);}
});
Intent intent = new Intent(Intent.ACTION_VIEW):使用Intent.ACTION_VIEW作为动作。这个动作是Android系统中预定义的,用于表示查看数据的操作。在这种情况下,它告诉Android系统我们想要查看网页。
intent.setData(Uri.parse("http://baidu.com")):这里使用Uri.parse()方法将字符串"http://baidu.com"转换成`Uri`对象。这个`Uri`对象代表了要查看的数据的地址,即百度的主页。

注意:我们可以在标签中再配置一个标签,用于更精确地指定当前活动能够响应什么类型的数据,主要配置:

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

运行之后:
按下Button1按钮就会跳转到百度页面:
在这里插入图片描述

  1. 创建一个活动使其打开网页:

创建一个活动为ThirdActivity:

修改AndroidManifest.xml中的代码:

<activityandroid:name=".ThirdActivity"tools:ignore="AppLinkUrlError"android:exported="true" ><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="http"/></intent-filter>
</activity>

注:具体来说,AppLinkUrlError是一个错误检查,它可能会在XML布局文件中检测到一个android:autoLink属性时被触发。android:autoLink属性用于指定文本中的URL、地址、电话号码等应该自动转换为可点击的链接。使用tools:ignore="AppLinkUrlError"属性可以告诉Android Studio忽略这个错误。

主活动中代码修改:

button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_VIEW);startActivity(intent);}
});

按下按钮的结果:
在这里插入图片描述

  1. 其他协议:指定其他的协议(tel:表示拨打电话;geo:表示地理位置等)
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);}
});

按下按钮的结果:
在这里插入图片描述

向下一个活动传递数据

主活动的代码:

Button button1 = (Button) findViewById(R.id.Button_1);
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String data = "Hello SecondActivity";Intent intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("extra_data",data);startActivity(intent);}
});
  1. Intent intent = new Intent(MainActivity.this,SecondActivity.class):这行代码创建了一个Intent对象,用于启动SecondActivityMainActivity.this是当前上下文(这里是MainActivity),SecondActivity.class是要启动的Activity的类。
  2. intent.putExtra(“extra_data”,data):这行代码使用putExtra方法将字符串data作为额外的数据添加到Intent中。"extra_data"是一个键,用于在目标Activity中检索这个数据。
  3. startActivity(intent):这行代码调用startActivity方法,并传入之前创建的Intent对象。这将启动SecondActivity,并且携带了之前添加的额外数据。

第二个活动的代码:

Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);

第二行代码:这行代码使用getStringExtra方法从Intent中提取一个名为"extra_data"的额外数据项。getStringExtra是一个便捷方法,专门用于检索字符串类型的额外数据。如果Intent中没有这个键的数据,或者数据不是字符串类型,将返回null

运行日志打印:
在这里插入图片描述

返回数据给上一个活动

从AndroidX库的Activity Result API开始,你可以使用ActivityResultContracts,它提供了一种更现代、类型安全的方式来启动Activity并接收结果。

例如,使用ActivityResult API:

主活动代码:

public class MainActivity extends BaseActivity {private ActivityResultLauncher<Intent> activityResultLauncher;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);Log.d("MainActivity", "task id is " + getTaskId());setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});//由第二个活动返回数据给主活动activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {if (result.getResultCode() == RESULT_OK) {Intent data = result.getData();if (data != null) {String resulyData = data.getStringExtra("data_return");Log.d("MainActivity", resulyData);}}});}
}
  1. ActivityResultLauncher 类: 这个类提供了注册回调的方法,例如 registerForActivityResult,它允许你注册一个 ActivityResultCallback 来接收启动的 Activity 的结果。
  2. 代码使用registerForActivityResult方法注册了一个ActivityResultLauncher。这个方法接受两个参数:一个ActivityResultContract的实例,在这个例子中是ActivityResultContracts.StartActivityForResult,它表示启动一个Activity并接收结果的标准契约;第二个参数是一个lambda表达式,用于定义当Activity的结果返回时如何处理。
  3. lambda表达式的主体部分,用于处理从SecondActivity返回的结果。首先检查结果码是否为RESULT_OK,这表示SecondActivity成功完成了操作。然后,尝试从返回的Intent中获取数据。如果数据不为空,从中提取字符串数据"data_return",并使用Log.d输出到日志。
  4. Button1按钮的点击事件,调用activityResultLauncher.launch(intent)启动SecondActivity。使用launch方法而不是startActivityForResult,因为我们已经通过ActivityResultLauncher处理了结果。

第二个活动中的代码:

Button button2 = (Button) findViewById(R.id.Button_2);
button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.putExtra("data_return", "Hello MainActivity");setResult(RESULT_OK,intent);finish();}
});

setResult方法用于设置SecondActivity的结果码和返回数据。第一个参数RESULT_OK表示操作成功完成,第二个参数是包含返回数据的Intent对象。finish方法用于关闭当前的SecondActivity,将其从用户界面中移除。

注意:

注意:当我们在第二个活动页面按下按钮返回到第一个活动界面会给第一个活动返回数据,但是当我们直接按下back按钮,则没有了返回数据,通过以下方法来解决,在SecondActivty中:

public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {// 这里实现Back键的自定义逻辑Intent intent = new Intent();intent.putExtra("data_return", "Hello MainActivity");setresult(RESULT_OK, intent);finish();return true; // 返回true表示事件已处理}return super.onKeyDown(keyCode, event);
}
  1. onKeyDownActivity类的一个方法,用于监听按键事件。当用户按下任何键时,这个方法会被调用。参数keyCode表示被按下的键的代码,event是对应的KeyEvent对象。
  2. KeyEvent.KEYCODE_BACK是一个常量,表示Back键的键码。这个条件判断用于检查是否按下了Back键。

运行日志打印:
在这里插入图片描述
到这里就结束了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/379195.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android10.0 锁屏分析-KeyguardPatternView图案锁分析

首先一起看看下面这张图&#xff1a; 通过前面锁屏加载流程可以知道在KeyguardSecurityContainer中使用getSecurityView()根据不同的securityMode inflate出来&#xff0c;并添加到界面上的。 我们知道&#xff0c;Pattern锁所使用的layout是 R.layout.keyguard_pattern_view&a…

HarmonyOS NEXT学习——@BuilderParam装饰器

初步理解&#xff0c;相当于VUE的插槽slot Builder function overBuilder() {}Component struct Child {label: string ChildBuilder customBuilder() {}Builder customChangeThisBuilder() {}BuilderParam customBuilderParam: () > void this.customBuilder; // 使用自定…

RK3568笔记三十六:LED驱动开发(设备树)

若该文为原创文章&#xff0c;转载请注明原文出处。 记录使用设备树编写一个简单的 LED 灯驱动程序 一、编程思路 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的 属性&#xff0c;编写测试应用程序。 • 首先向设备树添加 LED 设备…

使用Python Turtle绘制圣诞树和装饰

简介(❤ ω ❤) 在这篇文章中&#xff0c;我们将探索如何使用Python的Turtle模块来绘制一个充满节日气氛的圣诞树&#xff0c;以及一些可爱的装饰品。Turtle是一个受Logo语言启发的图形库&#xff0c;非常适合初学者学习编程和创建图形。 码农不是吗喽&#xff08;大学生版&…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现&#xff1a;实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

初学者如何通过建立个人博客盈利

建立个人博客不仅能让你在网上表达自己&#xff0c;还能与他人建立联系。通过博客&#xff0c;可以创建自己的空间&#xff0c;分享想法和故事&#xff0c;并与有相似兴趣和经历的人交流。 本文将向你展示如何通过建立个人博客来实现盈利。你将学习如何选择博客主题、挑选合适…

React学习笔记02-----React基本使用

一、React简介 想实现页面的局部刷新&#xff0c;而不是整个网页的刷新。AJAXDOM可以实现局部刷新 1.特点 &#xff08;1&#xff09;虚拟DOM 开发者通过React来操作原生DOM&#xff0c;从而构建页面。 React通过虚拟DOM来实现&#xff0c;可以解决DOM的兼容性问题&#x…

如何在gitee上创建远程仓库?

登录gitee网站后 填写自己的仓库信息后点击创建 然后来到一个新的界面可以看到自己的仓库地址 这样一个空白的仓库就建立好了 也可以按需选择初始化仓库

Python爬虫入门篇学习记录

免责声明 本文的爬虫知识仅用于合法和合理的数据收集&#xff0c;使用者需遵守相关法律法规及目标网站的爬取规则&#xff0c;尊重数据隐私&#xff0c;合理设置访问频率&#xff0c;不得用于非法目的或侵犯他人权益。因使用网络爬虫产生的任何法律纠纷或损失&#xff0c;由使用…

快手开源LivePortrait,实现表情姿态极速迁移,GitHub 6.5K Star

近日&#xff0c;快手可灵大模型团队开源了名为LivePortrait的可控人像视频生成框架&#xff0c;能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上&#xff0c;生成极具表现力的视频结果。如下动图所示&#xff1a; 来自网友测试LivePortrait 来自网友测试Li…

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识&#xff0c;我们可以告一段落了。下面呢&#xff0c;我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例&#xff0c;是基于Spring官方提供的骨架实现的。 Sprin…

LeetCode-随机链表的复制

. - 力扣&#xff08;LeetCode&#xff09; 本题思路&#xff1a; 首先注意到随机链表含有random的指针&#xff0c;这个random指针指向是随机的&#xff1b;先一个一个节点的拷贝&#xff0c;并且把拷贝的节点放在拷贝对象的后面&#xff0c;再让拷贝节点的next指向原链表拷贝…

Burp安全扫描Web应用

一、浏览器设置代理 如下图所示&#xff0c;点击火狐浏览器的“扩展和主题”&#xff0c;搜索“代理”。 如下图所示&#xff0c;选择搜索到的第一个代理&#xff08;选择任何一个都可以&#xff09;。 如上图所示&#xff0c;第一个点击后&#xff0c;进入如下页面&#xff0…

CT金属伪影去除的去噪扩散概率模型| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 A denoising diffusion probabilistic model for metal artifact reduction in CT CT金属伪影去除的去噪扩散概率模型 01 文献速递介绍 CT图像中的金属伪影是在CT扫描视野内存在金属物体&#xff08;如牙科填充物、骨科假体、支架、手术器械等&#xff09;时出…

爬虫(一)——爬取快手无水印视频

前言 最近对爬虫比较感兴趣&#xff0c;于是浅浅学习了一些关于爬虫的知识。爬虫可以实现很多功能&#xff0c;非常有意思&#xff0c;在这里也分享给大家。由于爬虫能实现的功能太多&#xff0c;而且具体的实现方式也有所不同&#xff0c;所以这里开辟了一个新的系列——爬虫…

破解反爬虫策略 /_guard/auto.js(二)实战

这次我们用上篇文章讲到的方法来真正破解一下反爬虫策略&#xff0c;这两个案例是两个不同的网站&#xff0c;一个用的是 /_guard/auto.js&#xff0c;另一个用的是/_guard/delay_jump.js。经过解析发现这两个网站用的反爬虫策略基本是一模一样&#xff0c;只不过在js混淆和生成…

桥接器设计模式例题

笔有大、中、小三种型号&#xff0c;纸有A4、8K、16K三种型号&#xff0c;颜料有红、蓝、绿三种&#xff0c;请采用桥接器设计模型进行系统设计&#xff0c;能够使用不同型号的笔在不同型号的纸上利用不同颜色的颜料进行绘画。 下面这段代码展示了一个简单的桥接模式(桥接模式)…

Vue--Router(路由)

目录 一 Router(路由) 1.作用 2.实现步骤 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;简单来说&#xff0c;就是用来实现vue的页面之间跳转的。 我们都知道&#xff0c;使用vue必然会涉及到很多个组件&#xff0c;也就是页面&#xff0c;而页面之间肯定需…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 3.事件传参与数据同步 事件传参 &#xff08;以下为错误示例&#xff09; 以上两者的…

【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式

注释&#xff1a; RTCM响应消息1020为GLONASS星历信息&#xff0c;暂不介绍&#xff0c;前公司暂未研发RTCM消息类型版本的DR/RTK模块&#xff0c;DR/RTK模块仅NMEA消息类型使用 注释&#xff1a; 公司使用的多信号语句类型为MSM4&MSM7&#xff0c;也应该是运用最广泛的语句…