[英]I want my timer to run in background but it stops as soon it goes in background android
##这个主要活动类##
>建议我给出合适的答案
pref = getPreferences(MODE_PRIVATE);
time = pref.getInt("key1", 300);
if (time == 300) {
**从碎片优惠中获取初始值**
number.setText("01:00:00");
startTimer(time, false);
} else {
startTimer(time, false);
}
}
private void prepareView() {
}
private void setOnListener() {
btnLunchOUT.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startTimer(time, true);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
btnLunchIN.setEnabled(true);
}
}, 2000);
}
});
这里m存储共享首选项中停止时间的值
btnLunchIN.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
countdownTask.cancel();
btnLunchIN.setEnabled(false);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
btnLunchOUT.setEnabled(true);
}
}, 3000);
btnReset.setEnabled(true);
Toast.makeText(getApplicationContext(), "Timer Stopped",
Toast.LENGTH_SHORT).show();
flag = false;
pref = getPreferences(MODE_PRIVATE);**
SharedPreferences.Editor edit = pref.edit();
edit.putInt("key", time);
edit.commit();
}
});
**从共享Prefrences获得开始时间的价值**
btnReset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!flag) {
// countdownTask.cancel();
btnReset.setEnabled(false);
btnLunchOUT.setEnabled(true);
btnLunchIN.setEnabled(false);
flag = false;
time = 300;
number.setText("00:00:00");// Reset Timing Format
pref = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("key", 300);
edit.commit();
}
}
});
}
@Override
public void onResume() { ## OnResume method where i think its problem but i m unable to trace it
System.out.println("In Resume");
super.onResume();
pref = getPreferences(MODE_PRIVATE);
time = pref.getInt("key", time);
number.setText("" + time);
s = (time) % 60;
m = ((time) / 60) % 60;
h = 00;
number.setText("0" + h + ":" + m + ":" + s);
startTimer(time, false);
}
## **onPause method** ##
@Override
public void onPause() {
System.out.println("Timer Pause:");
pref = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit(); // Saving the value of timer in shared preferences
edit.putInt("key", time);
edit.commit();
super.onPause();
}
## Here my timer starts on start button click
public void startTimer(int value, boolean isStartButton) {
time = value;
Log.e("ONMAIN:: ", "" + time);
if (isStartButton) {
countdownTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
time--; // ***Here i split 300 into HH:MM:SS format***
s = (time) % 60;
m = ((time) / 60) % 60;
h = 00;
System.out.println("In Run" + time);
>启用声音和振动器60秒
if (s < 10) {
if (m < 10) {
number.setText("0" + h + ":" + 0 + m + ":"
+ 0 + s);
}
} else if (s < 10) {
number.setText("0" + h + ":" + m + ":" + 0 + s);
} else if (m < 10) {
number.setText("0" + h + ":" + 0 + m + ":" + s);
}
else {
number.setText("0" + h + ":" + m + ":" + s);
}
btnLunchOUT.setEnabled(false);
btnReset.setEnabled(false);
if (time == 60) {
vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrate.vibrate(pattern, -1);
soundalert.start();
System.out.println("1 Minute Remianing ");
}
if (time == 1) {
countdownTask.cancel();
}
}
});
}
};
Timer countdown = new Timer(); //This is timer
countdown.scheduleAtFixedRate(countdownTask, 0, 1000);
flag = false;
}
}
}
使计时器在后台运行的最佳解决方案是通过Service
。 创建一个Service
,你开始(并传递给它的计时器的实例)上onPause
方法和你破坏它(并检索定时器)上onResume
方法,当你布林顶你的主要活动。
编辑:
public class TimerService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("SERVICE", "CREATED");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("SERVICE", "DESTROYED");
//Save your timer instance on destroy service
}
@Override
public void onLowMemory() {
super.onLowMemory();
Log.i("SERVICE", "LOW MEMORY");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Retrieve the timer instance here and use it...
//Restart service if Android destroys it!
return Service.START_NOT_STICKY;
}
}
在您的主要活动中,在onPause
启动服务(当活动进入后台时调用onPause
):
Intent inetnt=new Intent(this, TimerService.class);
intnet.putExtra("Timer", YourTimerInstance); //Instance as string or int...
startService(inetnt);
在主活动中,在onResume
(当您的活动再次进入前台时调用)停止服务并从中检索实例。 要做到这一点,你可以使用SharedPreferences
(也有thounsands例子SharedPreferences
在谷歌)。 要启动服务:
Intent inetnt=new Intent(this, TimerService.class);
//Retrieve timer instance
stopService(inetnt);
希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.