当前位置: 首页 > 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);% 创建时间序列…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...