0

0

Android 中在子 Activity 中访问父 Activity 数据的方法

心靈之曲

心靈之曲

发布时间:2025-08-14 15:54:19

|

998人浏览过

|

来源于php中文网

原创

android 中在子 activity 中访问父 activity 数据的方法

本文介绍了在 Android 应用开发中,子 Activity 如何访问启动它的父 Activity 中的数据。通过 ViewModel 的方式,将共享的数据和逻辑提取到 ViewModel 中,使得不同的 Activity 和 Fragment 都可以访问和修改这些数据,从而实现数据共享和解耦。

在 Android 开发中,经常会遇到子 Activity 需要访问启动它的父 Activity 中的数据或方法的情况。直接传递对象可能会导致内存泄漏或序列化问题。一种更优雅、更推荐的方式是使用 ViewModel。

ViewModel 是 Android Jetpack 组件库中的一个类,旨在以生命周期感知的方式存储和管理 UI 相关的数据。它允许数据在配置更改(例如屏幕旋转)后继续存在。更重要的是,ViewModel 可以在多个 Activity 和 Fragment 之间共享数据,从而避免了复杂的 Activity 间数据传递。

使用 ViewModel 实现数据共享

以下步骤展示了如何使用 ViewModel 在父 Activity 和子 Activity 之间共享数据和方法:

  1. 创建 ViewModel 类:

    创建一个继承自 ViewModel 的类,并将需要在 Activity 之间共享的数据和方法放在这个类中。

    import androidx.lifecycle.ViewModel;
    
    public class SharedViewModel extends ViewModel {
        private int a;
        private int b;
    
        public int add(int a, int b) {
            return a + b;
        }
    
        public int getA() {
            return a;
        }
    
        public void setA(int a) {
            this.a = a;
        }
    
        public int getB() {
            return b;
        }
    
        public void setB(int b) {
            this.b = b;
        }
    }
  2. 在父 Activity 中获取 ViewModel 实例:

    淘淘乐商城整站 For ECSHOP
    淘淘乐商城整站 For ECSHOP

    基于ECSHOP2.7.2制作,模板使用的是早期的凡客模板。整站大气,清爽。适合综合,鞋子,服饰类商城使用。具体安装方法在程序包中有说明,在使用之前请看下。 大体方法:1.上传程序至网站根目录,访问:域名/diguo (用户名:admin 密码:123456)2.设置好数据库信息,然后恢复数据,数据目录在www.shopex5.com下.3.修改data目录下的config数据库配置文件。4.登陆

    下载

    在父 Activity 中,使用 ViewModelProvider 获取 SharedViewModel 的实例。

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.lifecycle.ViewModelProvider;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class BaseActivity extends AppCompatActivity {
    
        private SharedViewModel viewModel;
        private Button btnCust;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 获取 ViewModel 实例
            viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
    
            btnCust = (Button) findViewById(R.id.btnCust);
            btnCust.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    String flag = "CU";
                    Intent i = new Intent(getBaseContext(), ChildActivity.class);
                    i.putExtra("flag", flag);
                    startActivity(i);
                }
            });
        }
    }
  3. 在子 Activity 中获取 ViewModel 实例:

    在子 Activity 中,也使用 ViewModelProvider 获取 相同的 SharedViewModel 实例。 关键在于使用相同的 ViewModelProvider。如果父Activity启动子Activity时,是在当前Activity的基础上启动的,那么子Activity和父Activity可以通过this这个参数共享同一个ViewModel。如果子Activity是一个独立的Activity,那么需要找到一个共同的生命周期所有者,例如Application或者一个共享的Activity。

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.lifecycle.ViewModelProvider;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class ChildActivity extends AppCompatActivity {
    
        private SharedViewModel viewModel;
        private Button btnCust;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_child);
    
            // 获取 ViewModel 实例
            viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
    
            btnCust = (Button) findViewById(R.id.btnCust);
            btnCust.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // 使用 ViewModel 中的方法
                    int add = viewModel.add(20, 50);
                    Toast.makeText(ChildActivity.this, "Result: " + add, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

注意事项:

  • 确保在父 Activity 和子 Activity 中使用相同的 ViewModelProvider 实例,这样才能访问同一个 ViewModel 对象。
  • ViewModel 的生命周期与 Activity 或 Fragment 的生命周期不同。它会一直存在,直到 Activity 或 Fragment 被完全销毁。
  • ViewModel 应该只包含 UI 相关的数据和逻辑,不应该包含任何与 UI 无关的业务逻辑。
  • 避免在 ViewModel 中存储 Context 对象,以防止内存泄漏。

总结:

通过使用 ViewModel,可以方便地在父 Activity 和子 Activity 之间共享数据和方法,避免了复杂的 Activity 间数据传递,提高了代码的可维护性和可测试性。 它也是 Android 开发中推荐的数据共享方式。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

283

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1751

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2038

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

277

2023.10.18

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

349

2024.03.01

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

283

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1751

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2038

2023.09.19

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

9

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号