Android:如何在旋转后恢复停止的计时器状态?

2023-12-09

我这样做是为了保存状态并在计时器运行时旋转后恢复状态。Android_Chronometer 暂停

当我将计时器停止在 X 秒,然后在 Y 秒后我更改方向时,计时器会标记 X+Y 秒。 我想将停止的天文钟的时间保留为旋转之前的时间,无论已经过去了多少时间。我应该怎么做?


我对 Chronometer 类以及如何适应方向变化也有类似的问题。虽然有一些有用的帖子和示例,但我发现没有一个能解决整个问题。

这是一篇有用的帖子Android_Chronometer 暂停,这有助于演示需要保存 elapsedTime 才能恢复计时。

然而,本文并没有讨论如何让 Chronometer 经受住 Android 生命周期方向的变化。计时器运行时与暂停时,您对经过时间的处理略有不同。

这是我把它们放在一起的——暂停、恢复、重置,在一个很好的类中,以及生存方向:

 public class ChronometerWithPause extends Chronometer {
    private long timeWhenStopped = 0;
    private boolean isRunning = false;

    private final String getTimeKey() {
        return "KEY_TIMER_TIME" + getId();
    }
    private final String getIsRunningKey() {
        return "KEY_TIMER_RUNNING" + getId();
    }

    public ChronometerWithPause(Context context) {
        super(context);
    }

    public ChronometerWithPause(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ChronometerWithPause(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void start() {
        setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
        isRunning = true;
        super.start();
    }

    @Override
    public void stop() {
        isRunning = false;
        timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
        super.stop();
    }

    public void reset() {
        stop();
        isRunning = false;
        setBase(SystemClock.elapsedRealtime());
        timeWhenStopped = 0;
    }

    public boolean isRunning() {
        return isRunning;
    }

    public long getCurrentTime() {
        return timeWhenStopped;
    }

    public void setCurrentTime(long time) {
        timeWhenStopped = time;
        setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
    }

    public void saveInstanceState(Bundle outState) {
        if (isRunning) {
            timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
        }
        outState.putLong(getTimeKey(), getCurrentTime());
        outState.putBoolean(getIsRunningKey(), isRunning());
    }

    public void restoreInstanceState(Bundle inState) {
        isRunning = inState.getBoolean(getIsRunningKey());
        setCurrentTime(inState.getLong(getTimeKey()));
        timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
        if (isRunning) {
            super.start();
        }
    }
}

请注意,您可以在onSaveInstanceState() and onCreate()像这样:

protected void onSaveInstanceState(Bundle outState) {
           ...
           timer.saveInstanceState(outState);
           ...

然后在 onCreate 中您可以使用以下命令恢复计时器功能:

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

Android:如何在旋转后恢复停止的计时器状态? 的相关文章

  • 如何为ScrollView放置固定图像背景?

    我应该想要滚动视图滚动 而不是背景中的图像 将图像添加到滚动视图框架之前的视图层次结构的较高位置
  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • Unity 纸板方向横向颠倒

    您好 我有一个 Unity 应用程序 它使用 google Cardboard SDK 来启用立体视图 因此我将有一个支持 VR 的应用程序 我的应用程序运行得很好 但是 如果我将播放器设置方向设置为自动方向 并且只允许向左横向和向右横向
  • C 中一元加 (+) 运算符的用途是什么?

    在 C 语言中 这样写是合法的 int foo 4 然而 据我所知 一元加 in 4是一个空操作 是吗 您可以将其用作表达式具有算术类型的一种断言 define CHECK ARITHMETIC x x 如果出现以下情况 这将生成编译时错误
  • Django:在信号中获取 m2m 相关对象

    我有点想看到类似的问题 Django 从 post save 信号访问 ManyToMany 字段 但仍然没有看到如何获取更新的相关对象列表 例如 我有以下型号 class User models Model username models
  • 在我的 x64 笔记本电脑上将平台目标设置为 x86 会阻止某些 WPF 类型正确加载

    我有一台运行 Windows 7 64 位的 x64 计算机 自本周初以来 我的情况似乎很奇怪 如果我构建并运行一个平台目标设置为 x86 的 WPF 应用程序 则在尝试创建网格时遇到 MissingMethodException var
  • 为什么无论代码中的顺序如何,alert() 对话框都会首先显示?

    在下面的代码示例中 我希望 div 中的文本首先发生变化 但只有在我在警报对话框中单击 确定 后 文本才会更改 var x 0 function counter x document getElementById aDiv innerHTM
  • 处理屏幕方向 - Android

    我的应用程序中的屏幕方向出现问题 我在 res layout lan 文件夹中为横向模式创建了备用布局 问题发生在方向改变时 1 重新创建一个活动而不破坏旧的活动 2 由于我在应用程序中使用媒体播放器 因此在屏幕旋转时 mp3 同时在两个方
  • Apache:客户端被服务器配置拒绝

    我正进入 状态 2012 年 4 月 24 日星期二 12 12 55 错误 客户端 127 0 0 1 客户端被服务器配置拒绝 labs Projects Nebula bin 我的目录结构如下所示 我使用的是 Symfony 2 其他
  • 为什么自托管 gitlab 运行程序在克隆存储库并在自托管运行程序上执行作业时遇到问题

    我目前正在研究 GitLab 运行程序 以更好地了解它们在 CI CD 管道环境中的工作方式 我按照 GitLab 文档中的说明创建了一个自我管理的运行器 即我的个人 Windows 笔记本电脑 安装了 GitLab Runner 可执行文
  • 是否可以使用私有 API 在 iPhone 上运行后台进程?

    我不打算将应用程序发送到商店 而是进行有限分发 我在想 如果我可以使用私有 API 进行后台处理 那么我就可以加入 iphone 开发者企业计划 并在我的公司内分发一个在后台运行的应用程序 我想这个问题的延伸是 如果我是一名企业开发人员 有
  • 将数据库从 Postgres 迁移到 MySQL [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我已更改数据库PostgreSQL to mysql 但我不知道如何将数据从一个传输到另一个 有谁知道我可以从中复制 迁移数据库的任何命令Postg
  • 使用 GDI+ 调整图像大小

    我真的很想从这段代码中找出更多的性能 它不是大量使用的代码 但每次上传新图像时都会使用 并且每个图像使用 4 次 100px 200px 500px 700px 因此 当处理的图像超过 2 或 3 个时 服务器会变得有点忙 另外 我正在尝试
  • 如何从 displaytag 中的 struts2 复选框获取复选框值到操作类

    我正在研究struts2我正在使用的应用程序显示标签用于分页支持 现在我想要表中的每一行都有一个复选框 因为我正在这样做
  • Uml / 序列 / 包 / ... JavaScript 和 Electron 应用程序的图表替代方案?

    我的问题是是否可以绘制任何类型的图表来可视化 Electron JavaScript 应用程序 我需要不同的 uml 图的替代方案 比如类或包图 但由于 JS 是基于原型的 它不像 Java 或 C 我不知道我能做什么 我唯一能够制作的是序
  • 固定位置在 Chrome 中不起作用

    我正在创建这些叠加的上一个和下一个箭头 就像这个网站上的那样 http www usatoday com 我遇到的问题是在 Chrome 中 箭头不会保持固定 当我向下滚动页面时 箭头会随着页面上升 你再也看不到它们了 奇怪的是 在 Fir
  • 检测用户对 OpenGL 方块的触摸[重复]

    这个问题在这里已经有答案了 可能的重复 如何确定屏幕上 3D 空间中触摸的内容 我正在开发一个 Android 应用程序 我也在使用 OpenGL 图形 我在屏幕上画了一个正方形 我想让用户在触摸它时移动它 换句话说 当用户将手指放在方块上
  • 遍历 Excel 下拉列表/验证列表

    我有一个带有验证列表的单元格 该列表会根据其他设置而变化 是否可以在代码中迭代该单元格 是否也可以将该单元格设置为列表中的第 n 项 Example The drop down for E2 depends on what was sele
  • django - 用户注销后存储会话值

    使用 Djangologout当用户注销时 所有会话值都会被刷新 即使用户注销 我也有办法保留一些会话值吗 您可能希望使用 cookie 而不是 session 来实现此目的 views py login view After you ha
  • CSV 写入需要唯一分隔符的文本字符串

    我用 python 编写了一个 HTML 解析器 用于提取数据 使其在 csv 文件中看起来像这样 itemA itemB itemC Sentence that might contain commas or colons like th
  • 如何找到 numpy 轴上的最终累积和? [复制]

    这个问题在这里已经有答案了 我有一个 numpy 数组 np array data shape 50 50 现在 我想找到 axis 1 上的累积和 问题是 cumsum 创建了一个累积和数组 但我只关心每一行的最终值 这当然是不正确的 n
  • Android:如何在旋转后恢复停止的计时器状态?

    我这样做是为了保存状态并在计时器运行时旋转后恢复状态 Android Chronometer 暂停 当我将计时器停止在 X 秒 然后在 Y 秒后我更改方向时 计时器会标记 X Y 秒 我想将停止的天文钟的时间保留为旋转之前的时间 无论已经过