如何保存数据并重新打开上次使用的Activity

2024-01-29

我已经完成了游戏的大部分机制,现在我需要能够:

  1. Save一切data当前活动和retrieve回来时(我希望有一个例子SharedPreferences如果这就是我需要的)

  2. 开背相同Activity I left from and在相同的time我离开的时候就是这样。


只是为了更清楚:我不想每次应用程序关闭甚至被杀死时都从我的主活动重新启动。


EDIT:

好的,我用过这个谷歌文章 https://developer.android.com/training/basics/activity-lifecycle/recreating.html为了保存我的活动并稍后重新创建它。

我的一项活动中的代码如下:

onCreate()

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

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        village = savedInstanceState.getString(VILLAGE);
        seekBarProgress = savedInstanceState.getInt(PROGRESS);
    } else {
        // Probably initialize members with default values for a new instance
        initializeVariables();
        Bundle bundle = getIntent().getExtras();
        village = bundle.getString(VILLAGE);
    }
        [...] // Other code skipped
    }

onSaveInstanceState()

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putString(VILLAGE, village);
    savedInstanceState.putInt(PROGRESS, seekBarProgress);
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

因此,我创建了一个调度员活动 https://stackoverflow.com/a/2441745/6489557(现在是我的主要)当应用程序被杀死然后重新启动时,知道哪个是最后一个打开的要启动的活动。但是当我尝试这样做时,它应该打开(即)PlayerSelection活动,我得到一个

java.lang.NullPointerException

因为它运行这部分代码

else { // Probably initialize members with default values for a new instance initializeVariables(); Bundle bundle = getIntent().getExtras(); village = bundle.getString(VILLAGE); }

而不是以前的if它运行的语句else.


调度员

这是调度程序活动,它过滤应启动的活动:

public class Dispatcher extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Class<?> activityClass;

    try {
        SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
        activityClass = Class.forName(
                prefs.getString("lastActivity", MainActivity.class.getName()));
    } catch(ClassNotFoundException ex) {
        activityClass = MainActivity.class;
    }

    startActivity(new Intent(this, activityClass));
    }
}

这是我发送到调度程序活动的内容:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("lastActivity", getClass().getName());
    editor.commit();
    }
}

Question

为什么会发生这种情况?我可以做什么来解决这个问题?


为什么会发生这种情况?

The Bundle创建于onSaveInstanceState仅保留用于短期重新启动,例如当您的活动由于方向改变而重新创建时。如果您的活动正常停止,Bundle不保留,因此无法交付给onCreate.

我可以做什么来解决这个问题?

不使用instanceState模型,而是将活动状态保存在SharedPreferences(类似于lastActivity您已经保存了)。 你应该将你的状态保存在onStop or onPause并将其恢复到onStart or onResume分别。在大多数情况下,前者就足够了,后者只会产生不必要的开销。


@Override
protected void onStart() {
    super.onStart();
    String saved = sharedPreferences.getString("myKey", null);
    MyPojo pojo;
    if(saved == null){
        pojo = defaultValue;
    }else {
        pojo = new Gson().fromJson(saved, MyPojo.class);
    }
}

@Override
protected void onStop() {
    sharedPreferences.edit().putString("myKey", new Gson().toJson(pojo)).apply();
    super.onStop();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保存数据并重新打开上次使用的Activity 的相关文章

随机推荐

  • DerivedData 中缺少 TestSummeries.plist 文件

    我正在使用 xcode 11 beta 在 iOS 13 0 设备上运行单元测试 测试执行后 它应该在里面生成一个 testummeries plist 文件 Users YourUsername Library Developer Xco
  • 使用 NSURLConnection 进行 POST - 无 JSON

    我正在尝试用 Objective C 编写一个 iPhone 应用程序 我需要使用 NSURLConnection 发布数据 我能找到的每个例子都涉及 JSON 我不需要使用 JSON 我需要做的就是 POST 数据并从 PHP 脚本获取简
  • Java 编译速度 vs Scala 编译速度

    我已经用 Scala 编程有一段时间了 我喜欢它 但令我恼火的一件事是编译程序所需的时间 这似乎是一件小事 但使用 Java 我可以对我的程序进行一些小更改 单击 netbeans 中的运行按钮 然后 BOOM 它正在运行 随着时间的推移
  • 什么是运行时环境?

    有人可以用简单的术语解释一下这意味着什么吗 是指应用程序代码运行的环境 DOS Windows Linux 等 吗 将其与开发环境和构建环境区分开来 您往往会在这里找到层次结构 运行时环境 执行程序所需的一切 但没有工具可以更改它 构建环境
  • 如何P/Invoke“__arglist”函数?

    背景 我用 C 编写了以下函数 extern C declspec dllexport int test const char 我使用 P Invoke 从 C 调用它 DllImport foo bar dll EntryPoint te
  • 使用 GPU PyOpenCL 优化 python 代码的不同方法:内核 GPU/PyOpenCL 内的 extern 函数

    我使用以下命令来分析我的 Python 代码 python2 7 m cProfile o X2 non flat multiprocessing dummy prof X2 non flat py 然后 我可以全局可视化不同贪婪函数的重新
  • 基类中的 Autofac 属性注入

    我正在开发 Windows Phone 8 1 应用程序 并且有一个具有公共属性的基类 public class ViewModelBase public ISomeClass MyProp get set 我的派生类看起来像这样 publ
  • 使用哪种 Micro ORM? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ViewPager与当前Fragment的通信

    我正在使用 ViewPager http developer android com reference android support v4 view ViewPager html http developer android com r
  • 在 WPF xaml 文件中引用另一个项目中的名称空间

    我引用另一个项目的命名空间 类库 所有模型都驻留在其中 正如相关问题中提到的 他们通过将程序集添加到 xaml 文件中解决了问题 但这对我不起作用 这就是我发帖的原因 我有 2 个项目 WPF 项目本身 类库 包含所有视图模型 WPF项目有
  • 使用pysftp下载文件

    我正在尝试加载 并直接保存在本地 csv文件存储在 FTP 服务器 SFTP 协议 上 我将 Python 与 pysftp 库结合使用 当我检查文件是否存在时 它返回 TRUE 但是当尝试加载文件时 无论我尝试什么 它似乎都是空的 如何将
  • 在特定时间启动和停止 MediaElement

    我正在将应用程序更改为 WPF 它根据定时事件播放音频 视频和图片 我使用了 string MciCommand string Format 播放帧从 0 到 1 2 前 我现在一直在 WPF c 中搜索并尝试解决这个问题 我有一个视频 w
  • 如何为 Wget 设置代理?

    我想使用代理通过 Wget 下载一些东西 HTTP Proxy 127 0 0 1 Port 8080 代理不需要用户名和密码 我怎样才能做到这一点 对于系统的所有用户 通过 etc wgetrc或仅适用于用户 wgetrc file us
  • 实体框架迁移添加列两次

    我正在运行 Entity Freemework Code First 迁移 尝试运行应用程序时 出现错误 列 ID 在规范中出现多次 我在配置中将 AutomaticMigrationsEnabled 设置为 true 因为当我运行项目时
  • highchart 和 .clone() 的问题

    我不明白当我克隆 highchart 时应该如何使用 jQuery clone 我知道 clone 不会链接对象上的方法 因此 高图的克隆看起来是正确的 但您无法再与它交互 所以 我一直在尝试以下操作 function clonage sr
  • 553 5.7.1 :发件人地址被拒绝:不属于用户 [电子邮件受保护]

    在 Rails4 应用程序中 我尝试通过配置 smtp 设置来发送电子邮件 但收到以下错误 553 5 7 1 发件人地址被拒绝 不属于用户所有 电子邮件受保护 cdn cgi l email protection 我正在使用以下设置 co
  • 2022 年 5 月 30 日之后如何通过 Google 使用 MailKit?

    到目前为止 我很高兴使用类似于以下的方法连接到我的 Gmail 帐户 public async Task
  • iOS7 UITableView 部分中的最后一个单元格强制全宽分隔符

    The UITableView下面有定制UITableViewCells我可以使用自定义中的这条线来调整分隔符UITableViewCell self separatorInset UIEdgeInsetsMake 0 kDefaultSe
  • 从链接打开 iOS 笔记应用程序并粘贴剪贴板的内容

    我希望能够通过网页或 Web 应用程序内部的链接在 iPhone 上打开 iOS 笔记应用程序 并自动粘贴剪贴板中的任何内容 或者打开已加载字符串的笔记 我知道可以使用如下链接打开笔记应用程序 a href Open notes a 有什么
  • 如何保存数据并重新打开上次使用的Activity

    我已经完成了游戏的大部分机制 现在我需要能够 Save一切data当前活动和retrieve回来时 我希望有一个例子SharedPreferences如果这就是我需要的 开背相同Activity I left from and在相同的tim