安卓Intent

news2024/11/13 12:33:49

文章目录

      • Intent
        • 新建一个活动
        • 显示Intent
        • 隐式Intent
        • 同多隐式Intent用法
        • 向下一个活动传递数据
        • 向上一个活动返回数据

Intent

  Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动Activity、启动Service以及发送广播等场景。Intent大致可以分为两种:显式Intent和隐式Intent。

新建一个活动

  新建一个Activity活动,取名为SecondActivity,并且勾选Generate a Layout File,给布局文件取名为second_activity。

  把自动生成的second_activity.xml文件的内容进行修改。

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

  SecondActivity.java 需要修改(我的Android Studio新建的文件会加一些其他代码,应该是考拉版本的原因)

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
    }
}

  要记得检查AndroidManifest.xml文件中是否已经进行了注册,一般情况下Android Studio会自动帮我们注册。因为SecondActivity不是主活动所以不需要配置。

显示Intent

  Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Class<?> cls)。这个构造函数接收两个参数:第一个参数Context要求提供一个启动Activity的上下文;第二个参数Class用于指定想要启动的目标Activity。

button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
        // 修改代码片段
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
        // ---------------
    }
});

Activity类中提供了一个startActivity()方法,专门用于启动Activity,它接收一个Intent参数

隐式Intent

  通过在标签下配置的内容,可以指定当前Activity能够响应的action和category。

<activity
    android: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>

标签指明了当前Activity可以响应com.example.activitytest.ACTION_START这个action,

标签包含了一些附加信息,更精确地指明了当前Activity能够响应的Intent中还可能带有的category。

只有和中的内容同时匹配Intent中指定的action和category时,这个Activity才能响应该Intent。

  修改FirstActivity文件。

button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
        // 修改代码片段
        Intent intent = new Intent("com.example.activitytest.ACTION_START");
        // ---------------
        startActivity(intent);
    }
});

android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。

每个Intent中只能指定一个action,但能指定多个category。

同多隐式Intent用法

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

button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
        // 修改代码片段
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http:/www.baidu.com"));
        // ---------------
        startActivity(intent);
    }
});

  这里首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。

  还可以在标签中再配置一个标签,用于更精确地指定当前Activity能够响应的数据。

android:scheme :用于指定数据的协议部分,如上例中的https部分。

android:host :用于指定数据的主机名部分,如上例中的www.baidu.com部分。

android:port :用于指定数据的端口部分,一般紧随在主机名之后。

android:path :用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。

android:mimeType :用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

  只有当标签中指定的内容和Intent中携带的Data完全一致时,当前Activity才能够响应该Intent。

  先创建一个ThirdActivity,修改third_layout.xml文件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <Button
 android:id="@+id/button3"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Button 3"
 />
</LinearLayout>

  编辑注册文件AndroidManifest.xml。

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

在这里插入图片描述

  除了https协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置、tel表示拨打电话。

button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
        // 修改代码片段
        Intent intent = new Intent(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:10086"));
        // ---------------
        startActivity(intent);
    }
});

在这里插入图片描述

向下一个活动传递数据

  Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,在启动另一个Activity后,就可以把这些数据从Intent中取出来。putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据。

button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
        // 修改代码片段
        String data = "Hello SecondActivity";
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        intent.putExtra("extra_data", data);
        // ---------------
        startActivity(intent);
    }
});

  在SecondActivity中将传递的数据取出。

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);
    }
}

在这里插入图片描述

向上一个活动返回数据

  Activity中有一个startActivityForResult()方法是用来启动活动的,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。startActivityForResult()方法在新版本中已经被官方弃用,但是版本都是向下兼容的,所以虽然被弃用了,但并不影响使用。

button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
        // 修改代码片段
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent, 1);
        // ---------------
    }
});

  在SecondActivity中注册点击事件,并在点击事件中添加返回数据的逻辑。setResult()方法接收两个参数:第一个参数用于向上一个Activity返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值;第二个参数则把带有数据的Intent传递回去。最后调用了finish()方法来销毁当前Activity。

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        /*Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);*/
        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "Hello FirstActivity");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

  SecondActivity被销毁之后会回调上一个Activity的onActivityResult()方法,因此我们需要在FirstActivity中重写这个方法来得到返回的数据,可以通过ctrl+O来创建。onActivityResult()方法带有3个参数:第一个参数requestCode,即我们在启动Activity时传入的请求码;第二个参数resultCode,即我们在返回数据时传入的处理结果;第三个参数data,即携带着返回数据的Intent。

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch(requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("FirstActivity", returnedData);
                }
                break;
            default:
        }
    }

在这里插入图片描述

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

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

相关文章

EPM 和 EPM-P 系列功率计

EPM 和 EPM-P 系列功率计 是德(KEYSIGHT)简述 EPM 功率计提供了 CW 和平均功率测量功能。EPM-P 功率计提供了峰值、均值、峰值均值比和时间选通功率测量功能。 EPM系列 功率计表 功能特点 EPM 和 EPM-P 系列提供高性能、可编程的功率计&#xff0c;以执行连续波、平均功率和…

Wasm(WebAssembly) 编译环境搭建、浏览器调用

参考:https://www.deanhan.cn/wasm.html 以下以Windows系统 c 语音编译为wasm为例说明: 安装npm访问Node.js官方网站:https://nodejs.org/ 点击“Download”按钮,选择Windows版本(32位或64位)。 下载完成后,运行安装程序。 安装过程中,确保选中了“Add Node.js to …

42 字典创建与删除

字典&#xff08;dict&#xff09;是包含 “键:值” 元素的无序可变序列&#xff0c;字典中的每个元素包含用冒号分隔开的 “键” 和 “值” 两部分&#xff0c;表示一种映射或对应关系&#xff0c;也称为关联数组。定义字典时&#xff0c;每个元素的 “键” 和 “值” 之间用冒…

嵌入式C++、ROS 、OpenCV、SLAM 算法和路径规划算法:自主导航的移动机器人流程设计(代码示例)

在当今科技迅速发展的背景下&#xff0c;嵌入式自主移动机器人以其广泛的应用前景和技术挑战吸引了越来越多的研究者和开发者。本文将详细介绍一个嵌入式自主移动机器人项目&#xff0c;涵盖其硬件与软件系统设计、代码实现及项目总结&#xff0c;并提供相关参考文献。 项目概…

云原生系列 - Docker(高级篇)

前言 学习视频&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删学习文档&#xff1a; 云原生系列 - Docker(基础篇)云原生系列 - Docker(高级篇)云原生系列 - Docker搭建私有仓库 云…

PieCloudVector:大模型时代下向量数据库的设计与应用

近几年大语言模型的突破带来自然语言相关的向量数据爆炸式增长&#xff0c;同时为管理这些向量数据而设计的向量数据库的关注度也在不断提高。大语言模型和向量数据库的组合在多个领域都具有广泛的应用&#xff0c;如语义检索、推荐系统、问答机器人等。本文将探讨向量数据库在…

超市是怎样高效完成客流统计与客流分析

随着科技的进步&#xff0c;越来越多的超市开始采用现代化的客流统计系统来优化日常运营和提升顾客体验。本文将探讨超市客流统计面临的难题、客流统计系统的构成及其应用场景&#xff0c;以及系统如何通过高识别率和热力图分析等功能为超市带来实际效益。 一、景区客流统计难题…

应用技术案例:复合机器人在精密制造领域的精准赋能

在精密制造这一对设备精度、稳定性及效率要求近乎苛刻的行业中&#xff0c;复合机器人以其无与伦比的多功能性、极致的灵活性以及精准的操控能力&#xff0c;正在为该领域实现降本增效。以下&#xff0c;我们分享一个富唯智能的复合机器人在精密制造领域的应用案例。 案例背景&…

记一次使用visual studio编译C++项目时无法找到 enum中的某些项

vs 2017 编译一个cocos2dx 的老项目时&#xff0c;报错&#xff1a; 在项目中搜索关键字 ARMATURE_LOOP_COMPLETE&#xff0c;发现在文件EventType.h中是有定义的&#xff0c;是 enum Event 的一项&#xff0c;而且确认了报错的文件已经引入了这个头文件&#xff1a; 于是想检查…

C++ 与其他编程语言区别_C++11/14/17新特性总结

C11 decltype类型推导 decltype不依赖于初始化&#xff0c;根据表达式类推导类型 auto b &#xff1a;根据右边a的初始值来推导出变量的类型&#xff0c;然后将该初始值赋给bdecltype 则是根据a表达式来推导类型&#xff0c;变量的初始值与表达式的值无关表达式类型注意点&…

React组件生命周期

一张图解释 React 类组件生命周期方法 React 类组件的生命周期可以分为三个主要阶段&#xff1a; 挂载&#xff08;Mounting&#xff09; 更新&#xff08;Updating&#xff09; 卸载&#xff08;Unmounting&#xff09; 挂载阶段 在组件实例被创建并插入到 DOM 中时调用…

目标检测 | yolov1 原理和介绍

简介 论文链接&#xff1a;https://arxiv.org/abs/1506.02640 时间&#xff1a;2015年 作者&#xff1a;Joseph Redmon 代码参考&#xff1a;https://github.com/abeardear/pytorch-YOLO-v1 yolo属于one-stage算法&#xff0c;仅仅使用一个CNN网络直接预测不同目标的类别与位置…

Transformer 会彻底改变时间序列预测吗?

欢迎来到雲闪世界。“生成式人工智能革命”的核心是谷歌于 2017 年推出的 Transformer 模型。 但每一次技术革命都会带来混乱。在快速增长的环境中&#xff0c;很难公正地评估创新——更不用说估计其影响了。 开启人工智能这一突破的Transformer模型&#xff0c;如今已成为一…

【Linux】文件描述符 fd

目录 一、C语言文件操作 1.1 fopen和fclose 1.2 fwrite和fread 1.3 C语言中的输入输出流 二、Linux的文件系统调用 2.1 open和文件描述符 2.2 close 2.3 read 2.4 write 三、Linux内核数据结构与文件描述符 一、C语言文件操作 在C语言中我们想要打开一个文件并对其进…

精进日常:每日练习与明智取舍的艺术

目录 题目1.对于非运行时异常&#xff0c;程序中一般可不做处理&#xff0c;由java虚拟机自动进行处理。2.下面哪个关键字可以用于Java的构造方法上&#xff1f;3.以下代码执行的结果显示是多少&#xff08; &#xff09;&#xff1f;注解总结 题目 选自牛客网 1.对于非运行时…

GCC编译:静态链接库与动态链接库

&#xff01; GCC 编译 C(C)静态链接库&#xff08;gcc -L、gcc -l&#xff09;和动态链接库&#xff08;gcc -fPIC -shared&#xff09;的创建和使用_fpic shared-CSDN博客https://blog.csdn.net/wohu1104/article/details/110789570静态链接库&#xff1a; 在 Linux 发行版…

JDFrame 一款比 Java 8 Stream 更灵活的数据处理工具

一、JDFrame 介绍 在大数据处理领域&#xff0c;Apache Spark以其强大的分布式计算能力和丰富的数据处理API而广受好评。然而&#xff0c;在许多日常的软件开发场景中&#xff0c;我们面临的数据量可能并不需要Spark这样的分布式系统来处理。相反&#xff0c;我们更希望有一种…

聊聊ChatGLM2-6B模型的微调

概述 GLM、ChatGLM的相关基础知识说明&#xff1a; GLM模型底层还是基于Transformer&#xff0c;因此其设计、优化都是围绕Transformer的各个组件的。从注意力层的掩码、位置编码等方面优化与设计。ChatGLM3/ChatGLM2的源码中&#xff0c;比如finetune、trainer等代码&#x…

看不见的硝烟:中国网络安全三十年沉浮史

昆仑侠 锦缎 2022 年 05 月 20 日 本文系基于公开资料撰写&#xff0c;仅作为信息交流之用&#xff0c;不构成任何投资建议。 2022 年 5 月 16 日&#xff0c;俄罗斯黑客组织 KillNet 向包括美国、英国、德国在内 10 个国家的政府正式 “宣战”。 2022 年 4 月 28 日&#xf…

vue如何在组件中监听路由参数的变化

使用 watch 监听 $route 对象 的变化&#xff0c;从而捕捉路由参数的变化 beforeRouteUpdate 导航守卫 当前组件路由更新时调用 beforeRouteUpdate 钩子只在组件被复用时调用&#xff0c;即当组件实例仍然存在时。如果组件是完全重新创建的&#xff0c;那么应该使用 beforeR…