我想在开关打开时24小时运行一个计时器,24小时后开关将关闭..
但问题是,如果活动关闭或按下后退按钮,计时器将被杀死!
经过一番研究后,我认为我需要将计时器作为服务运行吗?我该怎么办?谢谢每一个人。
这是我的计时器:
CountDownTimer timert = new CountDownTimer(86400000,1000) {
public void onTick(long millisUntilFinished) {
String TL =String.format(Locale.US ,"%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % TimeUnit.HOURS.toMinutes(1),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % TimeUnit.MINUTES.toSeconds(1));
TimeLeft.setText(TL);
}
public void onFinish() {
MainActivity.aSwitch.setChecked(false);
creditText.setText("Toggle On To Start");
}
};

答案 0 :(得分:2)
首先,后退按钮或关闭活动不会终止服务(除非服务已绑定但未启动)。然而,它会增加其资源被杀的可能性。
其次,服务不是长期计时器的正确方法。使用AlarmManager并设置警报。这样,即使您的服务被终止,它也会在计时器结束时由系统重新启动。
第三,你对该代码中的视图对象有静态引用吗?我甚至无法计算出一个坏主意的方式。在活动生命周期之外的任何内容都应触及视图。
答案 1 :(得分:0)
你也可以使用Handler这个..希望它有效
final WeakHashMap<String,Marker> obj = new WeakHashMap<>();
mRootRef.child("Coordinates/" + mRequestID)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Coordinates coordinates = dataSnapshot.getValue(Coordinates.class);
final String lat = coordinates.getLatitude();
final String lng = coordinates.getLongitude();
latLng1 = new LatLng(Double.valueOf(lat), Double.valueOf(lng));
markerOptions = new MarkerOptions()
.position(latLng1);
mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, 15));
mapa.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
Marker marker = mapa.addMarker( markerOptions);
marker.setSnippet(dataSnapshot.getKey());
marker.showInfoWindow();
// Here is where I create the unique marker identification
obj.put(dataSnapshot.getKey(), marker);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Coordinates coordinates = dataSnapshot.getValue(Coordinates.class);
final String lat = coordinates.getLatitude();
final String lng = coordinates.getLongitude();
latLng1 = new LatLng(Double.valueOf(lat), Double.valueOf(lng));
markerOptions = new MarkerOptions().position(latLng1);
// Now, it's just needed to update its new position
obj.get(dataSnapshot.getKey()).setPosition(latLng1);
mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, 15));
mapa.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
请记住您的public void countDownStart() {
handler = new Handler();
runnable = new Runnable(){
@Override
public void run(){
handler.postDelayed(this,1000);
try {
FestCountdownTimer timer = new FestCountdownTimer(00, 00, 9, 3, 01, 2017);
new CountDownTimer(timer.getIntervalMillis(), 1000) {
@Override
public void onTick(long millisUntilFinished){
int days = (int) ((millisUntilFinished / 1000) / 86400);
int hours = (int) (((millisUntilFinished / 1000)
- (days * 86400)) / 3600);
int minutes = (int) (((millisUntilFinished / 1000)
- (days * 86400) - (hours * 3600)) / 60);
int seconds = (int) ((millisUntilFinished / 1000) % 60);
String countdown = String.format("%02dd %02dh %02dm %02ds", days,
hours, minutes, seconds);
txtTimerDay.setText("" + String.format("%02d", days));
txtTimerHour.setText("" + String.format("%02d", hours));
txtTimerMinute.setText(""
+ String.format("%02d", minutes));
txtTimerSecond.setText(""
+ String.format("%02d", seconds));
}
@Override
public void onFinish() {
textViewGone();
MainActivity.aSwitch.setChecked(false);
creditText.setText("Toggle On To Start");
}
}.start();
} catch (Exception e) {
e.printStackTrace(); }
}
};
handler.postDelayed(runnable, 1 * 1000);
}
..月份从9 is Hours,3 is date,1 is Febraury Month
FestCoutdownTimer类
0th Index
希望它可以帮助你..