在我正在开发的应用程序中,我需要一个计时器来跟踪从第一次登录到达到某个目标的时间。对于计时器,我一直在使用计时器。
我的问题是,如果用户强制关闭应用程序的后台应用程序,计时器将重置。即使应用程序被用户强制关闭,我也需要计时器保持并更新。
目前,我的代码如下:
try{
FileInputStream fileIn = openFileInput(timerFilename);
InputStreamReader InputRead = new InputStreamReader(fileIn);
char[] timeInputBuffer = new char[HomeScreen.READ_BLOCK_SIZE];
t="";
int timeCharRead;
while((timeCharRead = InputRead.read(timeInputBuffer))> 0){
String readString = String.copyValueOf(timeInputBuffer, 0, timeCharRead);
t += readString;
}
InputRead.close();
} catch(Exception e){
e.printStackTrace();
}
if(t == null) {
try {
mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.start();
FileOutputStream fileout = openFileOutput(timerFilename, MODE_PRIVATE);
OutputStreamWriter outputWriter = new OutputStreamWriter(fileout);
outputWriter.write(Long.toString(SystemClock.elapsedRealtime()));
outputWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
else{
long currentTime = SystemClock.elapsedRealtime() - Long.parseLong(t);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
mChronometer.setBase(currentTime);
mChronometer.setText(sdf.format(new Date(currentTime)));
mChronometer.start();
}
为简洁起见,我省略了一些不相关的代码。
主要问题是,在将currentTime
长提供给mChronometer.setBase()
然后调用mChronometer.start()
后,计时器似乎完全随机,并且无法从我想要的位置开始。
我从在线研究中了解到,调用setBase()和start()仍然会导致计时器从00:00开始计数,但我的印象是调用mChronometer.setText()
应该解决这个问题,它是不
所以我的问题是,即使应用程序被强行关闭,如何保持计时器准时?
答案 0 :(得分:0)
来自developer.android.com
服务是在后台运行以执行的组件 长时间运行的操作或执行远程进程的工作。一个 服务不提供用户界面。例如,一项服务 当用户处于不同的状态时,可能会在后台播放音乐 应用程序,或者它可以通过网络获取数据而不会阻塞 用户与活动的互动。另一个组件,如 activity,可以启动服务并让它按顺序运行或绑定到它 与它互动。服务是作为服务的子类实现的 您可以在服务开发者指南中了解有关它的更多信息。
因此,只要您创建服务,并且用户退出您的应用程序,它仍然会运行。就像上面的例子一样。
这应该为您提供所需的所有信息: https://developer.android.com/guide/components/services.html
您还可以参考this获取有关如何实施在服务中运行的倒数计时器的示例。
修改强>
Chronometer
是Android中的UI小部件(实际上是TextView
)。因此,您无法将其用于非UI用途。请尝试使用Timer
或CountDownTimer
。
有关Timer
内Service
的示例用法,请参阅此内容: