Как проверить, что приложение закрыто или действие закрыто? - PullRequest
1 голос
/ 11 июля 2020

У меня есть приложение android, мне нужна одна функция или что-то еще, что может проверить, закрыто ли приложение, а не действие. У меня есть такое приложение. Если вы используете приложение в течение 10 секунд, где бы вы ни находились, вы получите уведомление «Тайм-аут». Для этого я использую таймер, для начала все работает нормально. Однако, когда я закрываю приложение, оно должно сохранить timeLeft для следующего запуска. Например: если у меня осталось всего 5 секунд, я закрываю приложение. В следующий раз, когда я открою приложение, таймер запустится с 5 секунд, а не с 10 секунд. Нет проблем, если я останусь в WelcomeFirst (действие, которое запускает таймер), но если я go перехожу к следующему действию, таймер будет отменен. Я не хочу этого, таймер будет отменен только тогда, когда приложение будет закрыто.

Есть ли способ проверить, закрыто ли приложение или действие? Я использую ActivityLifecycleCallbacks и класс приложения. Я тоже пробую эту функцию

private boolean isAppRunning() {
    ActivityManager m = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
    List<ActivityManager.RunningTaskInfo> runningTaskInfoList =  m.getRunningTasks(10);
    Iterator<ActivityManager.RunningTaskInfo> itr = runningTaskInfoList.iterator();
    int n=0;
    while(itr.hasNext()){
        n++;
        itr.next();
    }
    if(n==1){ // App is killed
        return false;
    }

    return true; // App is in background or foreground
}

Не работает.

Мой код

public class App extends Application implements Application.ActivityLifecycleCallbacks {

private Long START_TIME_IN_MILLIS  = 6000;
private  Boolean  mTimerRunning = false;
private Long mTimeLeftInMillis  = START_TIME_IN_MILLIS;
private  CountDownTimer mCountDownTimer;

@Override

public void onCreate() {
        super.onCreate();
       registerActivityLifecycleCallbacks(this);
    }
 @Override
    public void onActivityStarted(Activity activity) {

     //if the activity is WelcomeFirst then init the timer
      if (activity.localClassName == "WelcomeFirst") {
            SharedPreferences prefs = getSharedPreferences("prefsDay", Context.MODE_PRIVATE);
            mTimeLeftInMillis = prefs.getLong("millisLeft", 10000);
            mTimerRunning = prefs.getBoolean("timerRunning", false);
            startTimer();
        }
   
}

@Override
public void onActivityStopped(Activity activity) {

    //The code below mean if the Activity WelcomeFirst is closed then save the millisLeft for the next start.

if (activity.localClassName == "WelcomeFirst")  {
             mCountDownTimer.cancel();
              mTimerRunning = false;
            SharedPreferences prefs = getSharedPreferences("prefsDay", Context.MODE_PRIVATE);
            Editor editor = prefs.edit();
            editor.putLong("millisLeft", mTimeLeftInMillis);
            editor.putBoolean("timerRunning", mTimerRunning);
            editor.apply();
        }
       
     //I want to make the change. If The App is closed, then save the millisLeft for the next start.

     //Not the Activity is closed, then save the millisLeft for the next start
}

  private void startTimer() {
        mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
         
            }
        @Override
        public void onFinish() {
            mTimerRunning = false;
            Toast.makeText(this, "Time Out",Toast.LENGTH_SHORT).show()
        }

    }.start();
    mTimerRunning = true;
}

1 Ответ

0 голосов
/ 16 июля 2020

Используйте processLifeCyclerManager, чтобы решить вашу проблему. https://medium.com/trendyol-tech/android-architecture-components-processlifecycleowner-26aa905d4bc5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...