Android 中 Activity 之间的对象共享

2024-05-03

您好,我有一个关于在整个应用程序中传递对象的问题。 假设我想在整个应用程序中拥有一个大的自定义对象。 该对象将被多个活动和服务使用。 我一开始做的就是这样的。

首先,我创建了一个 Application 类并定义了一个单例对象。

public class FooApplication extends Application {
    public static SharedObj obj;
    ...
}

其次,在活动中我设置了该对象的值

public class FooActivity extends Activity {
    OnCreate() {
        FooApplication.obj = SharedObj.getInstance();
    }
}

第三,在另一个活动中我访问这个对象

public class BarActivity extends Activity {
    OnCreate() {
        SharedObj useThis = FooApplication.obj;
    }
}

我的问题是,这有什么问题吗? 它似乎工作正常,但我发现有时这个单例对象的值由于某种原因被设置为 null。 我像这样共享这个对象而不是使其可分割的主要原因是,这样做对我来说有点昂贵,而且我所做的看起来很容易做到。有缺点吗?

经过一番研究,我发现还有另一种方法可以在整个应用程序中共享对象。

首先,在app类中定义

public class FooApplication extends Application {
    public SharedObj obj = new SharedObj();
    ...
}

其次,在这样的活动中初始化

public class FooActivity extends Activity {
    OnCreate() {
        FooApplication fooApp = (FooApplication)getApplicationContext();
        fooApp.obj = new SharedObj();
    }
}

第三,在另一个活动中我访问这个对象

public class BarActivity extends Activity {
    OnCreate() {
        SharedObj useThis = ((FooApplication)getApplicationContext()).obj;
    }
}

此方法(使用 getapplicationContext())与我在第一部分中使用的单例对象有何不同?这个更推荐吗?

提前致谢!


这种方法的主要缺点是 Android 系统可能会在任何时间点终止您的进程 http://developer.android.com/guide/topics/processes/process-lifecycle.html。通常,当需要内存用于其他目的(例如接听电话)时,就会执行此操作。然后,Android 将重新启动您的进程,并重新创建每个活动(当活动变得可见时)。在此过程中,它将调用每个活动的 onCreate 方法,并向其传递该活动已保存的一组分割数据。

应用程序类也将被重新创建。但是,您保存在那里的对象将不会被重新创建。

因此,虽然很痛苦,但分割可以确保您的对象可以恢复到活动(和进程)被终止时的状态。

另一种方法是自己持久化该对象。使用 SharedPreferences 是一种常见的方法。

====

所以总而言之,我建议通过 Intent 将对象从一个 Activity 传递到另一个 Activity。重新创建该活动时,用于启动活动的意图始终会完全重新构建,即使在进程终止/重新启动的情况下也是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中 Activity 之间的对象共享 的相关文章

  • Eclipse Android 项目总是在调试中启动

    我觉得问这个问题很愚蠢 遇到这个问题更愚蠢 我有一个 Android 项目 到目前为止一直运行良好 但几天前 在我没有做任何我所知道的特别事情的情况下 无论我尝试什么 我的项目总是在调试中启动自己 单击调试或运行会给我相同的结果 我尝试查看
  • Gradle 错误:在操作系统独立路径“META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version”中找到多个文件

    我需要android 图像裁剪器我的 Android 应用程序的库 所以我将其添加到 gradle 依赖项中 同步后 出现了一些错误 这是一个 gradle 无法修复 发现多个文件具有与操作系统无关的路径 META INF androidx
  • 如何使用 WifiEnterpriseConfig 设置“使用系统证书”

    我想为我的应用程序的用户配置企业 WiFi 网络 因此 用户必须输入用户名和密码 其余的由应用程序处理 身份验证由 RADIUS 服务器 FreeRadius 3 处理 该服务器使用 LetsEncrypt 颁发的证书 因此无需导入我自己的
  • 将JSON数据解析到Android ListView中

    我已经潜伏这个网站很长一段时间了 幸运的是 到目前为止我所有的问题都得到了解答 我希望你们中的一些人能够阐明我的问题 我可以成功地让 ListView 来显示字符串数组 但是当我尝试将 JSON 数据解析为数组时 我的程序只是强制关闭 而
  • Facebook4j API:搜索

    我正在使用 Facebook4j 通过关键字获取状态 facebook4j conf ConfigurationBuilder fac new facebook4j conf ConfigurationBuilder fac setDebu
  • 当前版本的Android Gradle插件不支持按需配置

    升级到 Android Studio 3 1 2 后 出现以下错误 当前版本的 Android Gradle 插件不支持按需配置 因为您使用的是 Gradle 4 6 或更高版本 建议 通过在 gradle properties 文件中设置
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • 如何在其他呼叫运行时以编程方式合并呼叫(电话会议)

    我的要求是这样的 假设我当时正在拨打一个号码 并且我想以编程方式拨打另一个号码 到目前为止 我所做的是 当某些呼叫已经进行时 我能够呼叫特定号码 例如 假设我正在拨打号码 123 1 分钟后 通过使用Alarm Manger我触发一个事件来
  • startActivityForResult中的requestCode是什么意思

    我想知道我是否正确理解 requestCode 的概念 这个整数的用途是什么 我将其设置为哪个整数有关系吗 private static int CAMERA REQUEST 谢谢 requestCode 可帮助您识别您从哪个 Intent
  • 如何在 Android Studio 中构建项目测试目录?

    目前还没有这方面的约定 但是现在我如何构建 Android Studio 的测试目录呢 Android 测试基础 http developer android com tools testing testing android html页面
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • 如何使用共享首选项在两个 Android 应用程序之间共享数据?

    我有两个应用程序 App1 和 App2 我想使用共享首选项在 App1 中保存数据并在 App2 中访问 反之亦然 我可以在 App1 中保存数据并在 App2 中访问数据 但反之则不行 这就是我现在正在做的 在清单中 android s
  • 将触摸事件从 NestedScrollView 传递到父视图

    我在 NestedScrollView 下方有一个 ViewPager 宽度一些顶部填充 以及 ClipToPadding false 和透明背景 如图像 我的 ViewPager 无法获取触摸事件并且无法工作 我怎么解决这个问题 我无法更
  • 如何关闭导航抽屉以使用返回主页图标按钮?

    我也将操作栏与搜索栏一起使用 并且我需要像后退按钮一样使用 ActionBar ico 但我也在使用导航抽屉 如何关闭 隐藏 禁用导航抽屉菜单以使用后退按钮 我的 ActionBar 代码 Override public boolean o
  • 可用屏幕的尺寸

    我使用的是 Nexus 7 1280x800 android 4 2 2 API 17 我想获取屏幕的大小 将其划分为相同高度和宽度的正方形部分 我正在使用 FrameLayout 我的方块是 ImageView 的子类 我这样做 cont
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • Android Jetpack Compose 尺寸随持续时间变化的动画

    如何在 Jetpack Compose 中添加内容大小更改动画的持续时间 尝试使用Modifier animateContentSize 并通过动画规格具有持续时间 但它只是突然进入或退出 没有观察到持续时间 Column Modifier
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 如何检测日期选择器对话框的取消单击?

    我正在使用以下 日期选择器的示例 http developer android com guide tutorials views hello datepicker html http developer android com guide

随机推荐

  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 使用 jq 将两个 JSON 数组合并到一个文件中

    我有一个包含两个数组的 JSON 文件 我想将数组组合成一个对象数组 每个对象都包含每个原始数组中的一个元素 JSON 输入如下所示 en E1 E2 E3 E4 fr F1 F2 F3 F4 期望的输出 en E1 fr F1 en E2
  • 如何将/ff分支提升到HEAD

    我有一个受保护的分支 只有在集成构建上的集成构建通过后 才应提升 快进该分支 我目前尝试通过在集成分支的拉取请求上构建集成来解决这个问题 一旦成功 只需将发布分支快速转发到集成分支的尖端 但是 当我在 TFS 构建系统上构建分支时 它将检出
  • Visual Studio 2015 Update 2 和 Sql Server 2016 架构比较

    我最近升级到 Visual Studio 2015 Update 2 一切都很顺利 但是 现在当我尝试从数据项目与 Sql Server 2016 数据库进行架构比较时 它显示我需要在数据库中创建所有对象 在此更新之前 此功能运行良好 比较
  • 任务“:app:compileDebugJavaWithJavac”执行失败。运行 React Native 项目时

    我正在我真正的 Android 设备上运行现有的 React Native 项目 然后不知何故弹出这个错误 错误总是关于 找不到符号 我有 JDK 和 SDK 并将其添加到我的系统变量中 但我仍然不知道为什么它会给我这样的错误 我记得我只是
  • 每次向量元素变化时在 R 中分割向量

    每次元素值发生变化时 我都需要分割重复元素组的向量 例如 test vector lt c string1 string1 string1 string2 string2 string1 string1 string3 必须成为 1 1 s
  • curopt_binarytranfer 到底是什么意思?

    我不明白有什么区别 CURLOPT RETURNTRANSFER AND CURLOPT BINARYTRANSFER 我写了一个脚本来检查它
  • 由于参数中有空格,Bash 脚本因未知选项而失败

    我正在尝试运行 aws create lambda 函数 事情的经过如下 eval aws lambda create function function name FUNCTION NAME runtime RUNTIME role RO
  • 如何使用 ActionText 显示嵌入视频

    我正在尝试在 Rails 6 上使用 ActionText 显示嵌入式视频 无论是在 WYSIWYG Trix 中还是在渲染的内容中 但是 ActionText 渲染器会过滤所有原始 html 代码 并强制我使用 JS 在渲染内容中显示 i
  • 从节点内部开始一条边

    digraph foo a label
  • Linq 警告

    Linq 是 NET 的一个很棒的补充 我发现它在很多情况下都对我很有帮助 尽管我才刚刚开始学习如何使用 Linq 然而 在阅读有关 Linq 的文章时 我发现开发人员需要留意一些微妙的事情 否则可能会导致麻烦 我已经添加了一个明确的警告
  • Bash或Python,当打印字符到终端时,如何更改固定位置的字符?

    我想知道的事情应该是非常 基本 的 但这是我脑海中很长一段时间的问题 不知道窍门在哪里 假设在一个耗时的程序中 或者bash or Python 我必须打印出运行时的进度百分比 基本上我想打印1 一段时间后 我打印2 等等 我想要 2 完全
  • Boost C++ 和 Android 3

    我尝试用谷歌和SO搜索 到目前为止 我只能找到相互矛盾的信息 如果 Boost 和 Android 结合太难 也许有替代品 我对 smart ptr 线程 函数 lexical cast string algo 和容器特别感兴趣 任何意见都
  • 如何在android中使用jquery和phonegap打开pdf文件?

    最近我正在为 Android 构建一个应用程序 我正在使用phonegap 来做同样的事情 一切都运行良好 除了一个问题 即我无法在 android 中使用 jquery 打开 pdf 文件 我已经尝试了很多做同样的事情 但我无法做到这一点
  • 从主目录隐藏八度工作区文件

    我想更改文件octave workspace从我的主目录中 只需将其重命名为 octave workspace 如何设法使 Octave 识别具有此新名称的工作区文件 或创建一个新文件 Thanks 这就是该组织的目的octave core
  • 哪种 ZeroMQ 模式最适合异步套接字对?

    我有一个服务器 在亚马逊上运行 和一个连接到它的客户端 建立连接后 客户端和服务器仅相互通信并发送消息 e g 1 Client gt Server 2 Client gt Server 3 Client lt Server 4 Clien
  • Android:向系统添加自定义字体

    我知道如何在应用程序中使用自定义字体 但我想做的是在系统范围内添加自定义字体 就像在 Windows 上添加新字体一样 如果没有官方的方法 我应该阅读android源代码的哪个模块 我必须更改 android 源代码并构建它以支持自定义字体
  • 运行添加迁移时无法加载程序集 Microsoft.EntityFrameworkCore.Design

    我使用以下 csproj 创建了一个类库项目
  • 如何将 JSON 响应映射到 Angular 4 中的模型

    我已经尝试了很多 但无法将端点响应映射到我的模型 我正在使用 HttpClient 和 Angular4 我从服务中获取了数据 但它没有正确映射到我的模型类 我有以下 JSON 服务正在返回 result id 1 type User co
  • Android 中 Activity 之间的对象共享

    您好 我有一个关于在整个应用程序中传递对象的问题 假设我想在整个应用程序中拥有一个大的自定义对象 该对象将被多个活动和服务使用 我一开始做的就是这样的 首先 我创建了一个 Application 类并定义了一个单例对象 public cla