当前位置: 首页 > news >正文

安卓逆向之Android-Intent介绍

Intent是各个组件之间交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。Intent有多个构造函数的重载。

显式intent

显式 Intent 明确指定要启动的目标组件的类名。通过显式 Intent,开发者可以直接调用应用程序内的特定 Activity 或服务。主要用于应用程序内部组件之间的调用。比如在一个 Activity 中启动另一个 Activity。

Intent intent = new Intent(MainActivity.class,SecondActivity.class);
intent.putExtra("et1",et1Str);
startActivity(intent);
  • Intent intent = new Intent(...):这行代码创建了一个新的 Intent 对象。Intent 是 Android 中用于不同组件(如 Activity、服务等)之间进行通信的基础类。
  • new Intent(MainActivity.class, SecondActivity.class):这个构造函数的两个参数分别是起始 Activity和目标 Activity。在这个例子中,从 MainActivity 目标是 SecondActivity。这意味着当 Intent 被启动时,应用程序会在 SecondActivity 中打开界面。
  • intent.putExtra("et1", et1Str):这行代码用于将额外的数据放入 Intent 中。在这里,"et1" 是键(key),而 et1Str 是与之关联的值。这种方式允许我们在启动的 SecondActivity 中接收 et1Str 的值,便于在新的界面上使用或显示该数据。
  • startActivity(intent):这行代码调用 startActivity 方法,使用先前创建的 Intent 启动 SecondActivity。执行这一行后,应用程序将离开 MainActivity,并加载 SecondActivity 的界面。

隐式intent

隐式 Intent 不直接指定目标组件,而是通过指定一个动作(Action)和/或数据(Data)来指示系统执行某种操作。系统会根据 Intent 的信息查找可以处理该 Intent 的合适组件。

隐式 Intent 允许多个应用程序响应同一个 Intent。只要有一个组件注册了与 Intent 的动作、类别和数据匹配的 intent-filter,就可以接收到这个 Intent。

java部分

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
  • Intent intent = new Intent(Intent.ACTION_VIEW);:这行代码创建了一个新的 Intent 对象,指定了动作为 ACTION_VIEW
  • intent.setData(Uri.parse("https://www.baidu.com"));:这行代码将 Intent 的数据设置为一个 URI(统一资源标识符),在这个例子中是百度的网页地址 "https://www.baidu.com"。使用 Uri.parse() 方法将字符串转换为 URI 格式,这允许系统知道需要打开什么资源。
  • startActivity(intent);:这行代码使用先前创建的 Intent 启动一个新的 Activity。在这里,它通常会打开一个浏览器或系统的 Web 视图,展示所指定的 URL。

AndroidManifest.xml部分

<activity android:name=".SecondActivity"><intent-filter><action android:name="com.example.test.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /><data android:scheme="http"></intent-filter></activity>
  • <activity android:name=".SecondActivity">:这行代码在 AndroidManifest.xml 文件中声明了一个 Activity,名为 SecondActivity
  • <intent-filter>:这个标签用于定义这个 Activity 能够响应的 intent
  • <action android:name="com.example.test.action.VIEW" />:这行代码定义了一个自定义的动作,com.example.test.action.VIEW,意味着这个 Activity 可以处理带有这个动作的 Intent。
  • <category android:name="android.intent.category.DEFAULT" />:这行代码将意图分类为默认类别,表示这个 Activity 可以处理一些常见的意图。
  • <data android:scheme="http" />:这行代码指定了这个 Activity 处理的数据类型,主要是以 http 开头的 URI。在这里,它明确表示这个 Activity 可以接收以 httphttps 开头的网址。

对比

特点

显式 Intent

隐式 Intent

目标指定法

直接指定目标组件(类名)

不指定目标组件,通过 Action、Data 让系统解析

适用场景

应用内组件间的通信

向系统或其他应用发送请求

安全性

相对更安全,明确调用

相对不安全,需要意图过滤器匹配

注册需求

无需在 Manifest 中注册

需要在 Manifest 中使用 intent-filter 注册

使用示例

new Intent(this, SecondActivity.class)

new Intent(Intent.ACTION_VIEW)

intent接收字符串

Intent intent = getIntent();
String data = intent.getStringExtra("et1");

接收名为et1的参数值

第二个组件返回数据

有两种方式一种式通过startActivityForResult,一种是通过back键

第一种 不按back键

// 在第一个 Activity 中  
Intent intent = new Intent(this, SecondActivity.class);  
startActivityForResult(intent, 1); // 1为请求码,用于标识该请求

使用 startActivityForResult() 方法启动第二个组件(Activity)。这允许第一个组件在第二个组件结束时接收结果。

// 在第二个 Activity 中  
EditText editText = findViewById(R.id.editText);  
String resultData = editText.getText().toString();  // 处理用户点击的按钮  
Button button = findViewById(R.id.button);  
button.setOnClickListener(v -> {  Intent resultIntent = new Intent();  resultIntent.putExtra("returnData", resultData); // 返回数据  setResult(RESULT_OK, resultIntent); // 设置结果为 OK,并传递数据  finish(); // 结束该 Activity  
});

在第二个组件(Activity)中,获取用户输入的数据,并在用户完成操作后使用 setResult() 方法将数据返回给第一个组件,然后调用 finish() 结束该 Activity。

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  super.onActivityResult(requestCode, resultCode, data);  if (requestCode == 1) { // 检查请求码  if (resultCode == RESULT_OK) { // 检查结果是否 OK  String returnData = data.getStringExtra("returnData");  // 处理返回的数据  Toast.makeText(this, "Received: " + returnData, Toast.LENGTH_SHORT).show();  }  }  
}

在第一个组件中,重写 onActivityResult() 方法,以接收来自第二个组件的结果。可以通过请求码来识别该结果是来自哪个 Activity。

第二种 按back键

如果用户通过点击 Back 键返回到第一个 Activity,在正常情况下,Back 键会关闭第二个 Activity,而不会返回任何结果。在这种情况下,onActivityResult() 方法将不会被调用,因为没有通过 setResult() 返回结果。如果你希望在用户按 Back 键时处理结果,可以在第二个 Activity 中重写 onBackPressed() 方法,并使用 setResult() 返回数据。

@Override  
public void onBackPressed() {  Intent resultIntent = new Intent();  resultIntent.putExtra("returnData", "User cancelled"); // 设置返回数据  setResult(RESULT_CANCELED, resultIntent); // 设置结果为 CANCELLED  super.onBackPressed(); // 调用父类方法,结束该 Activity  
}

那么第一个组件种也要重写onActivityResult来接收传递的值

@Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {  super.onActivityResult(requestCode, resultCode, data);  if (requestCode == 1) { // 检查请求码  if (resultCode == RESULT_OK) { // 检查结果是否 OK  String returnData = data.getStringExtra("returnData");  // 处理返回的数据  Toast.makeText(this, "Received: " + returnData, Toast.LENGTH_SHORT).show();  }  }  }  

仔细观察会发现他们第二个组件都是差不多的,都有以下相同的代码逻辑

Intent resultIntent = new Intent();  
resultIntent.putExtra("returnData", "User cancelled"); // 设置返回数据  
setResult(RESULT_CANCELED, resultIntent); // 设置结果为 CANCELLED  
super.onBackPressed(); // 调用父类方法,结束该 Activity  

但是如果通过按back键来返回的话就多了一个 重写onBackPressed的过程,他是针对用户需要进行back键来返回的逻辑处理,通俗来讲也就是针对用户按下back键这一操作的逻辑处理。

不同场景 使用不同的方式 例如:

  • 如果用户必须完成某项操作后才能返回数据,那么使用 不按back的方式 是更合适的选择。
  • 如果你希望记录用户退出的状态,或者允许用户在不完成输入的情况下返回数据,重写 onBackPressed() 来返回一些适合的默认值是一个很好的选择。

相关文章:

安卓逆向之Android-Intent介绍

Intent是各个组件之间交互的一种重要方式&#xff0c;它不仅可以指明当前组件想要执行的动作&#xff0c;而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。Intent有多个构造函数的重载。 显式intent 显式 Intent 明确指定要启动的…...

数据库日期时间用什么类型?

数据库中的日期时间类型主要包括DATE、TIME、DATETIME和TIMESTAMP等&#xff0c;它们在存储、格式和范围等方面有所不同。以下是这些类型的详细说明和异同比较&#xff1a; 1. DATE类型 用途&#xff1a;用于存储日期值&#xff0c;不包含时间部分。格式&#xff1a;YYYY-MM-…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中&#xff0c;字符串是最常用的数据类型之一。字符串用于表示文本数据&#xff0c;而正则表达式则是一种强大的工具&#xff0c;用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

Leecode刷题C语言之N皇后

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1))…...

即时通讯| IM+RTC在AI技术加持下的社交体验

即时通讯作为互联网的重要应用之一&#xff0c;见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流&#xff0c;发展到如今的语音、视频通话&#xff0c;甚至是虚拟现实社交&#xff0c;已经渗透到生活的社交、娱乐、商务等方方面面&#xff0c;成为现代社会不可或缺的一…...

repo仓库转移到自己本地的git服务器

前提条件&#xff1a;搭建好gitolite 以转移正点原子rk3568_linux工程为例子&#xff0c;将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…...

人工智能-深度学习-神经网络-激活函数

激活函数通过引入非线性来增强神经网络的表达能力&#xff0c;对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数&#xff0c;因此激活函数必须是可微的&#xff0c;也就是说能够求导的。 满足激活函数的条件 1.可微分&#xff0c;也就是可求导 激活函…...

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…...

IAR中编译下载未下载问题

第一张图片是正常下载&#xff0c;第二张未正常下载。经过查看download选项发现 启用了 suppress download &#xff08;禁用下载)...

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...

英语系统语法书面记载:高级语法 8 的状语从句

在英语高级语法中&#xff0c;状语从句是一种用来修饰动词、形容词、副词或整个句子的从句&#xff0c;它提供有关时间、地点、原因、条件、方式、让步等信息。状语从句通常由特定的连词引导。以下是常见的几种状语从句类型及其用法&#xff1a; 1. 时间状语从句 (Adverbial Cl…...

C语言:深入理解指针(1)

一.内存和地址 在讲内存和地址之前&#xff0c;我们想有个生活中的案例&#xff1a; 假设有一栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的一个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨个房子去…...

priority_queue--优先队列

一、认识优先队列 priority_queue&#xff08;优先队列&#xff09;是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器。它的底层实现通常是用堆&#xff08;一般是二叉堆&#xff09;来实现的。优先队列中的元素按照一定的优先级顺序进行排列&#xff0c;在队首的…...

Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算

论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …...

开发一套ERP 第八弹 RUst 插入数据

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...

回退用 git revert 还是 git reset?

git revert 会生成一个新的 commit 来记录此次操作&#xff1b;git reset 是把 HEAD 指针向前挪动一次&#xff0c;会减少一个 commit。 回退用 git revert 回退还是用 git reset&#xff0c;核心就一点&#xff1a; 是否需要记录这次回退。 如果需要记录这次回退&#xff0c…...

【docker】多阶段构建与基础构建,及企业案例展示

基础构建与多阶段构建对比 基础构建&#xff08;单阶段构建&#xff09; 在基础构建中&#xff0c;所有构建过程和最终的应用程序都在同一个镜像中进行&#xff0c;构建工具和最终应用程序都会在最终镜像中。 这样构建镜像时会包含所有的构建工具和依赖&#xff0c;因此最终镜…...

基于链表的基础笔试/面试题

1. 反转链表 问题描述&#xff1a;反转一个单向链表。 示例&#xff1a; 输入&#xff1a;1 → 2 → 3 → 4 → 5 输出&#xff1a;5 → 4 → 3 → 2 → 1 class ListNode {int val;ListNode next;ListNode(int x) {val x;} }public class LinkedList {public ListNode …...

SARIMA 模型Matlab代码

% 导入数据 data readtable(data.xlsx); % 假设数据在第一列 y data{:, 1}; % 获取第一列数据% 划分训练集和测试集&#xff0c;80% 训练&#xff0c;20% 测试 trainSize floor(0.8 * length(y)); trainData y(1:trainSize); testData y(trainSize1:end);% 创建时间序列…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...