【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.mzph.cn/bicheng/47279.shtml

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

相关文章

Android Media3 技术应用详解

1、音视频基础 一个简单的音视频链路如下&#xff1a; 1&#xff09;采集&#xff0c;音视频经过采集后分别生成音频流和视频帧&#xff0c;音频是流式的物理上没有帧的概念&#xff0c;但为了数据处理的方便实际数据处理中引入了音频帧的概念&#xff0c;一般中间插入静音数据…

《学会 SpringBoot · 定制 SpringMVC》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

元宇宙深入解析

元宇宙&#xff08;Metaverse&#xff09;是一个新兴的概念&#xff0c;它激发了技术专家、艺术家和商业领袖的无限想象。它代表着数字互动的新前沿&#xff0c;提供了一个平行的数字宇宙&#xff0c;用户可以在其中实时互动&#xff0c;超越物理世界的限制。 元宇宙是什么&am…

一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取 点击注册&#x1f517;开通七牛开发者帐号如果已有账号&#xff0c;直接登录七牛开发者后台&#xff0c;点击这里&#x1f517;查看 Access Key 和 Secret Key 2. Node.js获取七牛token 安装qiniu npm install qiniu创建空间 Node获取token const qi…

美国INSTRUMENTS的L2/L6/L10/L20/L50线性放大器与ATA-L水声放大器

一、企业背景&#xff1a; Aigtek是一家来自中国的专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大学的专家教授等联合组成研发团队&#xff0c;目前…

QT开发笔记:信号和槽

乱码问题&#xff1a; 出现乱码问题原因只有一个&#xff1a;就是编码方式不匹配&#xff01;&#xff01;&#xff01; 中文常见汉字4K,算上各种生僻字差不多六万字 仍然使用一个大表格&#xff0c;给每个汉字&#xff0c;分配一个整数即可。 字符集~~表示汉字的字符集&#…

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期&#xff1a;2024 年 7 月 10 日 星期三 姓名&#xff1a;XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位&#xff0c;参加部门早会&#xff0c;了解了今天的实习任务和目标&#xff0c;即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

LeetCode-随机链表的复制

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

免分助手神器-交管12123学法减分模拟考试题目及答案 #经验分享#其他

“驾照学法减分”为驾驶人提供了一种积极参与交通安全事业、减缓驾驶证扣分的方式&#xff0c;有益于促进驾驶人形成遵守交通规则、规范驾驶行为的良好习惯&#xff0c;提高道路交通安全意识和素养。然而&#xff0c;持有人仍需严格遵守道路交通安全法律法规&#xff0c;减少交…

1.MQ介绍

MQ 消息队列&#xff0c;本质是一个队列&#xff0c;先进先出&#xff0c;只不过队列中存放的内容是message而已。 为啥学习MQ 1.流量消峰 如果一个订单系统最多每秒能处理一万次订单&#xff0c;正常情况下我们下单1秒后就能返回结果。但是在高峰期&#xff0c;如果有两万…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1"&#xff0c;选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机&#xff0c;比如我选择的是192.168.0.104&#xff1a; 结果提示&#xff1a;Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

splunk编写自定义命令

1. 自定义命令简介 splunk有丰富的内置搜索命令&#xff0c;但也提供了编写自定义命令来实现个性化的搜索需求&#xff0c;以此方式扩展splunk搜索处理语言&#xff08;SPL&#xff09;。 自定义搜索命令是一个可执行文件&#xff0c;可读入和写出数据&#xff0c;它可以是一…

办公效率翻倍!2024最适合办公电脑安装的系统推荐!

当前&#xff0c;电脑已成为我们日常办公最常用的工具。为了确保高效顺畅的办公体验&#xff0c;选择一款合适的操作系统至关重要。那么&#xff0c;如何找到并下载最适合办公电脑的操作系统呢&#xff1f;接下来系统之家小编为您推荐2024年最适合办公电脑安装的系统&#xff0…

Qt窗口程序整理汇总

到今日为止&#xff0c;通过一个个案例的实验&#xff0c;逐步熟悉了 Qt6下 窗体界面开发的&#xff0c;将走过的路&#xff0c;再次汇总整理。 Qt Splash样式的登录窗https://blog.csdn.net/castlooo/article/details/140462768 Qt实现MDI应用程序https://blog.csdn.net/cast…

基于单片机STC89C52和GSM实现的远程拨号开锁设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于单片机STC89C52和GSM实现的远程拨号开锁设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘要 仿真图 单片机系统流程图 实物图 代码 系统论文 资源下载 摘要 本文介…

python数据可视化(9)——绘制小提琴图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 python&#xff1a;3.12.3 所有库都使用最新版。 Python绘制小提琴图 小提琴图(violin plot…

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备&#xff1a; 任意markdown编辑器&#xff0c;以typora为例pandoc&#xff0c;官方下载地址 思路整理&#xff1a; 从swagger提取离线md文档将md文档转换为word格式 操作步骤&#xff1a; 一、安装pandoc &#xff08;markdown编辑器安装略&#xff09; 前往官网…

Yak与nuclei的深度融合:打造高效漏扫生态,解锁PoC管理新姿势

在Yakit中使用nuclei很简单&#xff0c;只需要几行代码。在Yak Runner中&#xff0c;使用下面代码&#xff0c;指定扫描的目标与选项&#xff0c;便能调用nuclei的漏扫能力&#xff1a; results:nuclei.Scan(target,opts...)~for result in results { dump(result)} 比如以…

UNiapp微信小程序Ucharts

效果图如下 以上为加载接口所得数据的玫瑰图与折线图 具体步骤如下 1&#xff0c;将插件导入Hbuiler 所需要的项目中&#xff08;插件地址&#xff1a;秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场&#xff09; 2&#xff0c;导入成功是这样的 3&#xff0c…

相对定位语法:css+xpath基础语法使用-定位页面元素

文章目录 CSS相对定位获取元素关系定位顺序关系 XPath相对定位基础语法顺序关系-通过索引获取元素选取元素 总结 ✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来&#xff01; 编程真是一件很奇妙的东西。你只是浅尝辄止&#xff0c;那么只会觉得枯燥乏味&#xff0c…