我将一堆活动捆绑在一起,一个进入下一个等等。现在,在一项活动中,我想测量经过的时间。据我了解,我会使用System.nanoTime()
来查找开始时间,用户会做一些事情,然后再次使用它来查找结束时间,减去两个并且消耗我在活动上花费的时间。但是假设在我的活动运行时发生了一些事情:我已经创建了开始时间,但现在用户接到了电话或其他东西,我的活动被放到了后台。电话呼叫结束,用户返回活动。计时器是否在整个时间运行,即使应用程序在后台运行?自从我离开应用程序后,计时器是否“重置”然后又回到了它?
另外,当我启动System.nanoTime()
时,是否会返回自特定活动或主要活动开始以来的时间?
编辑:假设我在某个点设置了第一个刻度线,然后应用程序进入后台,然后它返回到前景并设置第二个刻度线。理想情况下,我希望时间过去以及在后台花费的时间; System.nanoTime()
实现了这个目标吗?
答案 0 :(得分:2)
static long nanoTime()
:
返回本地系统上可用的最精确计时器的当前时间戳。
你没有使用“计时器”(也就是任何类型的有状态对象)来表示经过的时间,你只是挂了很长时间。正如您所指出的,您将在以后的某个时间点再次调用System.nanoTime()并减去以查找已用时间。
如果您想要排除在此活动之外花费的时间,例如问题中的示例,则需要使用onPause()
和onResume()
来帮助您管理计算。或者,如果切换到某种计时器对象,请使用这些方法暂停和恢复计时器。
您可以在任何您认为最有意义的地方“启动”您的“计时器”。如果是用户启动某些操作(如按下按钮),请在OnClickListener中进行操作。如果只是测量某些方法/代码路径的运行时间,请在开头处进行。
答案 1 :(得分:1)
根据doc
System.nanoTime()
返回最精确的当前值 可用的系统计时器,以纳秒为单位。
所以它不是一个计时器。它只是以纳秒为单位返回系统时间。它与活动无关。
如果要测量活动的生命周期,请在onCreate和onDestroy中获取时间。如果你想花时间知道活动在前景中的时间,那么在onResume和onPause中获取时间。
答案 2 :(得分:0)
您需要覆盖Activity类中的onPause()和onResume()方法,以便暂停暂停计时器。并继续onResume。
你应该在onResume()
上放置System.nanoTime()