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 实例:

    FloatSearch
    FloatSearch

    FloatSearch是一个专业的AI搜索引擎,提供多样化的见解

    下载

    在父 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

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

342

2023.08.14

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

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

1821

2023.08.22

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

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

2143

2023.09.19

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

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

284

2023.10.18

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

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

380

2024.03.01

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

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

342

2023.08.14

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

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

1821

2023.08.22

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

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

2143

2023.09.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共1课时 | 0.1万人学习

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

共13课时 | 1.0万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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