【Android】我的手机在...自己下载...那个(浅析Intent基础运用)

【Android】我的手机在…自己下载…那个(浅析Intent基础运用)

在Android开发中,Intent(意图)是一个非常重要的概念。它不仅仅是用于在应用程序的各个组件之间进行通信的工具,也是启动新的Activity、Service,或者广播信息的关键机制。本文将深入探讨Intent的作用、类型以及使用方法。

什么是Intent?

简单来说,Intent是一种消息对象,用于在应用程序的不同组件(如Activity、Service、BroadcastReceiver)之间传递数据和启动操作。它可以描述一个操作要执行的动作,比如启动一个新页面或播放一段音频。

Intent主要有两种类型:显式Intent和隐式Intent。

1. 显式Intent

显式Intent明确指定了要启动的组件。在这种情况下,Intent对象包含了目标组件的类名,这样系统就知道要启动哪个Activity。

这里给出一个显示Intent在两个活动间切换的示例:

创建一个MainActivity的活动以及一个SecondActivity的活动,代码如下

MainActivity:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);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;});findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);}});}
}

MainActivity的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/button_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是一个按钮哦"/></LinearLayout>

SecondActivity:

public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_second);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.secondActivity), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});}
}

SecondActivity的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/secondActivity"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="你好!" /></LinearLayout>

点击运行:

image-20240620221004159

点一下这个这是一个按钮哦。

image-20240620221311424

显式 Intent 的缺点

1. 仅适用于应用内通信

显式Intent主要用于同一应用程序内的组件之间的通信,不适合跨应用程序的通信场景。

2. 组件的耦合性

显式Intent通过指定类名的方式将组件绑定在一起,增加了组件之间的耦合性,不利于组件的解耦和复用。

2. 隐式Intent

Intent的结构

一个Intent包含了以下几个主要部分:

  • Action(动作):定义了要执行的操作,比如Intent.ACTION_VIEW
  • Data(数据):要操作的数据,比如一个URL。
  • Category(类别):附加信息,用来进一步指定操作的类型。
  • Extras(额外数据):键值对,用于传递附加信息。

隐式Intent不明确指定目标组件,而是通过描述要执行的操作或携带的数据,由系统根据这些信息进行匹配,找到最适合处理该Intent的组件。这种Intent通常用于跨应用程序的通信,或当多个组件可以处理同一个操作时使用。

示例:

同样是上述的两个活动,将MainActivity中的按钮监听事件替换为:

        findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.activitytest.ACTION_START");intent.addCategory("com.example.activitytest.MY_CATEGORY");startActivity(intent);}});
  1. 获取按钮并设置点击监听器:通过findViewById获取按钮并设置点击监听器OnClickListener
  2. 创建隐式Intent:在onClick方法中创建一个新的Intent,指定其action"com.example.activitytest.ACTION_START"
  3. 添加类别:通过addCategory方法为Intent添加一个自定义类别"com.example.activitytest.MY_CATEGORY"
  4. 启动Activity:使用startActivity(intent)方法启动匹配该Intent的Activity。

而后在AndroidManifest文件里面修改SecondActivity的活动。

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

这段代码在AndroidManifest.xml文件中为一个Activity配置了一个<intent-filter>,使该Activity能够响应特定的隐式Intent。具体配置如下:

  1. :定义一个Intent过滤器。
  2. :指定Intent的action"com.example.activitytest.ACTION_START"。这个Action告诉系统,当Intent的Action是这个字符串时,应该考虑这个过滤器。
  3. :指定Intent的类别android.intent.category.DEFAULT。这个是默认类别,表示这是一个普通的Intent。
  4. :再添加一个自定义类别"com.example.activitytest.MY_CATEGORY",表明只有同时包含这个类别的Intent才能匹配到这个过滤器。
1. <intent-filter> 标签

<intent-filter>标签用于在AndroidManifest.xml文件中定义一个Intent过滤器。Intent过滤器告诉系统该Activity可以处理哪些Intent。

2. <action> 标签
<action android:name="com.example.activitytest.ACTION_START"/>

<action>标签定义了这个Intent过滤器能够处理的动作。在这个例子中,动作的名称是com.example.activitytest.ACTION_START。这通常是一个自定义的动作名称,由开发者定义。

3. <category> 标签
<category android:name="android.intent.category.DEFAULT"/>

<category>标签定义了这个Intent过滤器的类别。在这个例子中,类别是android.intent.category.DEFAULT。这个类别表示这个Intent过滤器是默认的,如果一个Intent包含android.intent.category.DEFAULT类别,那么这个过滤器可以匹配该Intent。

3. 隐式Intent其他用法

例如:可以通过Intent来下载…那个。

仍然是改变MainActivity中的点击事件

        findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("https://ys-api.mihoyo.com/event/download_porter/link/ys_cn/official/android_default"));startActivity(intent);}});

点一下这个按钮。

image-20240621123730118

就可以得到:

image-20240621123909445

4. 向下一个活动传递数据

在Android应用程序中,Activity之间传递数据是一项常见的任务。数据传递通常通过Intent实现,可以通过Extras将数据附加到Intent中,并在目标Activity中接收这些数据。下面将详细介绍如何在两个Activity之间传递数据。

基本数据类型的传递:

示例:

仍然是重写onClick方法:

        findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String data = "hello laoziyuanxuezhang";Intent intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("extra_data",data);startActivity(intent);}});

Intent intent = new Intent(MainActivity.this, SecondActivity.class);

  • 创建一个Intent对象,用于启动SecondActivity。Intent的构造函数接收两个参数:当前Activity的上下文(MainActivity.this)和目标Activity的类(SecondActivity.class)。

intent.putExtra(“extra_data”, data);

  • 使用putExtra方法将字符串数据(data)添加到Intent中。数据被存储在Intent的附加信息(Extras)中,键名为"extra_data"。

startActivity(intent);

  • 使用startActivity方法启动SecondActivity,并将包含附加数据的Intent传递给它。

再在SecondActivity中修改代码,接收上一个活动传递过来的数据,并打印:

public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_second);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.secondActivity), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Intent intent = getIntent();String data = intent.getStringExtra("extra_data");Log.d("SecondActivity",data);}
}

Intent intent = getIntent();

  • 获取启动这个Activity的Intent对象。

String data = intent.getStringExtra(“extra_data”);

  • 从Intent中提取附加数据。使用getStringExtra方法获取键名为"extra_data"的字符串数据。

Log.d(“SecondActivity”, data);

  • 使用Log.d方法将接收到的数据打印到Logcat,以便进行调试和查看。

运行,点击按钮,查看日志:

image-20240621155547173

5. 返回数据给上一个活动

使用 ActivityResult API 传递数据

1. 在 MainActivity 中启动 SecondActivity 并接收结果
MainActivity.java
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ActivityResultLauncher<Intent> activityResultLauncher;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化 ActivityResultLauncheractivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result -> {if (result.getResultCode() == RESULT_OK) {Intent data = result.getData();if (data != null) {String returnData = data.getStringExtra("return_data");// 处理返回的数据Log.d("MainActivity", "Received data: " + returnData);}}});findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);activityResultLauncher.launch(intent);}});}
}
2. 在 SecondActivity 中返回数据
SecondActivity.java
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);findViewById(R.id.button_return).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent returnIntent = new Intent();returnIntent.putExtra("return_data", "Hello from SecondActivity");setResult(RESULT_OK, returnIntent);finish(); // 结束当前活动并返回结果}});}
}

详细步骤解析

  1. 配置依赖项:确保你的项目中包含activity-ktxfragment-ktx库。
  2. MainActivity.java:
    • 定义ActivityResultLauncher:使用registerForActivityResult方法来注册一个用于启动Activity的launcher。
    • 启动SecondActivity:当按钮被点击时,通过activityResultLauncher.launch(intent)启动SecondActivity。
  3. SecondActivity.java:
    • 返回数据:在SecondActivity中,创建一个包含数据的Intent,并通过setResult(RESULT_OK, returnIntent)设置结果,然后调用finish()结束Activity。

完整代码示例

MainActivity.java
public class MainActivity extends AppCompatActivity {private ActivityResultLauncher<Intent> activityResultLauncher;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化 ActivityResultLauncheractivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result -> {if (result.getResultCode() == RESULT_OK) {Intent data = result.getData();if (data != null) {String returnData = data.getStringExtra("return_data");// 处理返回的数据Log.d("MainActivity", "Received data: " + returnData);}}});findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);activityResultLauncher.launch(intent);}});}
}
SecondActivity.java
public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);findViewById(R.id.button_return).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent returnIntent = new Intent();returnIntent.putExtra("return_data", "Hello from SecondActivity");setResult(RESULT_OK, returnIntent);finish(); // 结束当前活动并返回结果}});}
}

使用ActivityResult API来实现Activity之间的数据传递和结果返回,替代过时的startActivityForResult方法。

使用Intent的注意事项

  1. 明确使用显式或隐式Intent:根据需要选择适当的Intent类型,显式Intent用于内部组件通信,隐式Intent用于跨应用程序通信。
  2. 处理可能的异常:当使用隐式Intent时,确保应用程序能够处理目标Activity不存在的情况。
  3. 安全性考虑:避免通过Intent传递敏感数据,使用安全的方式进行数据传递和保护。

结论

Intent是Android开发中非常强大且灵活的工具。通过理解和熟练使用Intent,开发者可以在应用程序的不同组件之间高效地进行通信和操作。无论是启动Activity、Service,还是发送广播,Intent都扮演着至关重要的角色。

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

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

相关文章

表组装示例

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDO…

光伏能源圈

2021年&#xff0c;新型电力系统之下&#xff0c;中国已形成了两网五大六小的电力新格局&#xff1a; 两大电网&#xff1a;国家电网、南方电网 五大电力央企&#xff1a;国家能源投资集团、中国华能集团、中国华电集团、中国大唐集团、国家电力投资集团。 六小豪门&#xf…

python判断语句

目录 布尔类型和比较运算符if语句的基本格式if else 语句if elif else 语句判断语句的嵌套 布尔类型和比较运算符 1、布尔类型 bool布尔类型只有两个结果&#xff1a;真或假 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假&#x…

一切前端概念,都是纸老虎

4、listener可以通过 store.getState() 得到当前状态。如果使用的是 React&#xff0c;这时可以触发重新渲染 View。 function listerner() { let newState store.getState(); component.setState(newState); } 对比 Flux 和 Flux 比较一下&#xff1a;Flux 中 Store 是…

ChatGPT API教程在线对接OpenAI APIKey技术教程

一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互&#xff0c;这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库&#xff0c;以及由社区维护的库。 要安装官方的 Python 绑定&#xff0c;请运行以下命令&#xff1a; pip install open…

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

集群开发学习(三)修改用户模块(git 使用,局域网设代理)

git 使用 参考&#xff1a;https://blog.csdn.net/weixin_60033897/article/details/136016074 在服务器端创建公钥私钥 git config --global user.email "1686660735qq.com" git config --global user.name qinliangql git config --global -l # 查看信息# 这样可…

Java-内部类成员内部类

类的五大成员 属性 方法 构造方法 代码块 内部类 什么是内部类&#xff1f; 在一个类的里面&#xff0c;再定义一个类。 举例&#xff1a;在A类的内部定义B类&#xff0c;B类就被称为内部类 内部类表示的事物是外部类的一部分 内部类单独出现没有任何意义 内部类的访问特点 1.…

YOLOv8模型代码学习

1.参考文献 链接1 2.网络模型解析 2.1卷积神经单元&#xff08;conv.py&#xff09; 在该文件中定义了yolov8网络中的卷积神经单元&#xff0c;位置如图所示。 def autopad(k, pNone, d1): # kernel(卷积核), padding(填充), dilation(扩张)"""Pad to same…

Xlua三方库Android编译出错解决办法

Xlua三方库Android编译出错解决办法 最近听老师的热更教程&#xff0c;讲到xlua编译android平台会报错&#xff0c;也是看了老师的博客&#xff0c;按照方法去解决&#xff0c;然而问题并没有解决。应该是因为代码更新或者版本不一样&#xff0c;在此简单记录一下解决过程。 参…

[RPI4] 树莓派4b安装istoreos及使用 -- 1. 系统安装

最近在研究家庭智能化的一些东西,其中包括网络,智能家居等一系列内容,然后看过的资料有的想再回来看的时候就找不到了,然后就想着开这么一个系列,做一些记录,先从智能家居开始吧。 1 安装istoreos系统 iStoreOS 目标是提供一个人人会用的路由兼轻 NAS 系统,不管是作为路…

Transformer预测 | 基于Transformer的风电功率多变量时间序列预测(Matlab)

文章目录 预测效果文章概述模型描述程序设计参考资料预测效果 文章概述 Transformer预测 | 基于Transformer的风电功率多变量时间序列预测(Matlab) Transformer 模型本质上都是预训练语言模型,大都采用自监督学习 (Self-supervised learning) 的方式在大量生语料上进行训练,…

python桌面应用

py文件 import osimport wx import wx.html2class MyFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, title"启动啦", size(1000, 700))# 创建一个Web视图组件self.browser wx.html2.WebView.New(self)# 加载本地HTML文件# self.brow…

考研数学|《李林880》正确率多少算合格?

李林880题是针对考研数学三的练习题集&#xff0c;覆盖了考研数学三的主要知识点和题型。如果能够熟练掌握这些题目&#xff0c;意味着对考研数学三的知识点有了较为深入的理解和应用能力。 首先&#xff0c;考研数学三的总分是150分&#xff0c;题型包括单选题、填空题和解答…

RN开发搬砖经验之—“Calculated frame index should never be lower than 0“崩溃问题分析

问题重现 崩溃堆栈&#xff1a; Back traces starts. java.lang.RuntimeException: java.lang.IllegalStateException: Calculated frame index should never be lower than 0at com.facebook.react.animated.NativeAnimatedModule$1.doFrameGuarded(NativeAnimatedModule.ja…

【因果推断python】53_效应异质性和非线性带来的挑战1

目录 Treatment Effects on Binary Outcomes 合成一些数据 由于缺乏基本事实&#xff0c;在单位层面预测治疗效果极为困难。因为我们只能观察到一个潜在结果 T(t) &#xff0c;我们无法直接估计它。相反&#xff0c;我们必须依靠目标变换&#xff08;也可以看作是设计巧妙的损…

【专利】一种光伏产品缺陷检测AI深度学习算法

申请号CN202410053849.9公开号&#xff08;公开&#xff09;CN118037635A申请日2024.01.12申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司发明人&#xff08;公开&#xff09;张俊峰(总); 叶长春(总); 廖绍伟 摘要 本发明公开一种光伏产品缺陷检测AI深度…

全国计算机二级C++题库笔记

全国计算机二级C题库笔记 Ⅰ. 选择题专项训练1 公共基础部分2 二级C程序设计第1~4章》每章标题1. C标识符命名规则2. 面向对象的三个主要特征3. C的四个开发步骤4. 关于类和对象的叙述5. !和&&的作用6. C枚举类型初值问题7. ASCII码对照表8. 运算符两边的数据类型&…

SAPUI5基础知识8 - 模块(Module)的使用

1. 背景 在SAPUI5中&#xff0c;几乎所有东西都是一个模块&#xff08;例如&#xff1a;控件&#xff0c;控制器&#xff0c;组件等等&#xff09;&#xff0c;通过依赖管理&#xff0c;模块间可以相互调用。这样做的好处是&#xff0c;可以仅在需要时才去加载必需的模块&…

基于单片机的智能台灯控制系统

摘要&#xff1a; 文章设计一款单片机智能台灯控制系统&#xff0c;实现对台灯的手动和自动控制功能&#xff0c;以 STC89C52 单片机作为多功能智能台灯的主控制器&#xff0c;光电检测模块检测坐姿&#xff0c;红外传感器检测人体&#xff0c;光敏电阻检测光强&#xff0c;同…