Я нашел некоторый код здесь в stackoverflow, который, как я думал, решит проблему, возникшую у меня с обратным отсчетом времени. К сожалению, это не помогло мне полностью достичь того, чего я хочу достичь.
Проблема в том, что я использую Службу для прослушивания обратного отсчета, а когда заканчивается обратный отсчет, я сохраняю значение для логического значения, также при запуске обратного отсчета. Это логическое значение сохраняется, чтобы пользователи не могли злоупотреблять службой в моем приложении.
Проблема в том, что отсчет времени не работает, пока приложение закрыто. Поэтому я хотел бы, чтобы countdowntimer продолжал работать, когда пользователь закрывал приложение, и даже изменял значение логической переменной после завершения countdowntimer, а затем сохранял в sharedprefs, поэтому, когда пользователь возвращается в приложение, мы можем проверить, нужно ли задерживать пользователя для некоторых функций или нет ,
MainActivity
private BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"BroadcastReceiver received");
updateGUI(intent); // or whatever method used to update your GUI fields
}
};
@Override
public void onResume() {
super.onResume();
registerReceiver(br, new IntentFilter(BroadcastService.COUNTDOWN_BR));
userUpdateDelay=getBooleanFromSP(this);
Log.i(TAG, "Registered broadcast receiver");
}
@Override
public void onPause() {
super.onPause();
saveBooleanInSP(this,userUpdateDelay);
unregisterReceiver(br);
Log.i(TAG, "Unregistered broacast receiver");
}
@Override
public void onStop() {
try {
unregisterReceiver(br);
saveBooleanInSP(this,userUpdateDelay);
} catch (Exception e) {
// Receiver was probably already stopped in onPause()
}
super.onStop();
}
@Override
public void onDestroy() {
stopService(new Intent(this, BroadcastService.class));
saveBooleanInSP(this,userUpdateDelay);
Log.i(TAG, "Stopped service");
super.onDestroy();
}
private void updateGUI(Intent intent) {
if (intent.getExtras() != null) {
long millisUntilFinished = intent.getLongExtra("countdown", 0);
userUpdateDelay = intent.getBooleanExtra("stopdelay",true);
Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
if(!userUpdateDelay){
// StopService, no userDelay anymore!
// If user hits updatePrice-btn again, startService and set userDelay!
stopService(new Intent(MainActivity.this, BroadcastService.class));
}
}
}
public static void saveBooleanInSP(Context _context, boolean value){
SharedPreferences preferences = _context.getSharedPreferences("test", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("USER_DELAY", value);
editor.apply();
}//savePWDInSP()
public static boolean getBooleanFromSP(Context _context) {
// TODO Auto-generated method stub
SharedPreferences preferences = _context.getSharedPreferences("test", Context.MODE_PRIVATE);
return preferences.getBoolean("USER_DELAY", false);
}//getPWDFromSP()
BroadcastService
import android.app.Service;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.util.Log;
public class BroadcastService extends Service {
private final static String TAG = "BroadcastService";
public static final String COUNTDOWN_BR = "gasprices.countdown_br";
Intent bi = new Intent(COUNTDOWN_BR);
CountDownTimer cdt = null;
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Starting timer...");
cdt = new CountDownTimer(10000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
bi.putExtra("countdown", millisUntilFinished);
sendBroadcast(bi);
}
@Override
public void onFinish() {
Log.i(TAG, "Timer finished");
bi.putExtra("stopdelay",false);
sendBroadcast(bi);
}
};
cdt.start();
}
@Override
public void onDestroy() {
cdt.cancel();
Log.i(TAG, "Timer cancelled");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}