Продолжайте отсчет времени, даже когда пользователь закроет приложение - PullRequest
0 голосов
/ 25 мая 2019

Я нашел некоторый код здесь в 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;
    }
}
...