Проверьте, вызывается ли активность onStop при запуске новой активности

Я пытаюсь решить проблему. В моем заявлении мне нужно определить, если onStop Метод был вызван из-за начала нового действия или вызван после того, как пользователь нажал кнопку "Домой" или переключился на другое приложение.

У меня есть класс BaseActivity, и мне нужно проверить его здесь.

Я пытался найти способ сделать это, но, к сожалению, до сих пор не найдено решение.

Может быть, есть обходной путь для этого.

Идея состоит в том, чтобы дифференцировать инициатора onStop вызов метода.

Буду благодарен за любую помощь.

2 ответа

Возможным решением было бы зарегистрировать ActivityLifecycleCallbacks и сохранить ссылочное имя последнего действия, вызвавшего onResume:

public class ActivityChecker implements Application.ActivityLifecycleCallbacks {
  private static ActivityChecker mChecker;
  private String mCurrentResumedActivity = "";

  public static ActivityChecker getInstance() {
    return mChecker = mChecker == null ? new ActivityChecker() : mChecker;
  }

  // If you press the home button or navigate to another app, the onStop callback will be called without touching the mCurrentResumedActivity property.
  // When a new activity is open, its onResume method will be called before the onStop from the current activity.
  @Override 
  public void onActivityResumed(Activity activity) {
    // I prefer to save the toString() instead of the activity to avoid complications with memory leaks. 
    mCurrentResumedActivity = activity.toString();
  }   


  public boolean isTheLastResumedActivity(@NonNull Activity activity) {
    return activity.toString().equals(mCurrentResumedActivity);
  }

  // [...] All other lifecycle callbacks were left empty
}

ActivityLifecycleCallbacks могут быть зарегистрированы в вашем классе приложения:

public class App extends Application {

  public App() {
    registerActivityLifecycleCallbacks(ActivityChecker.getInstance());
  }

}

Не забудьте зарегистрировать это в своем манифесте:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="your.package.name">    

    <application
        ...
        android:name=".App"
        > ...
    </application>
</manifest>

Затем вы можете использовать его в своей основной деятельности.

public class MyBaseActivity {
  @Override protected void onStop() {
    if(ActivityChecker.getInstance().isTheLastResumedActivity(this)) {
      // Home button touched or other application is being open.
    }
  }
}

Рекомендации:

Регистрация вашего пользовательского класса Application и ActivityLifecycleCallbacks: https://developer.android.com/reference/android/app/Application.html

После написания этого я нашел эту ссылку с некоторыми другими вариантами, чтобы получить текущую возобновленную активность: Как получить текущий контекст активности переднего плана в Android?,

Вы можете использовать SharedPreferences, чтобы проверить это:

@Override
    protected void onStop() {
        super.onStop();
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
        pref.edit().putBoolean("IfOnStopCalled", true).apply();
    }

Проверьте в вашей BaseActivity:

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
Boolean IfOnStopCalled = pref.getBoolean("IfOnStopCalled",false);

if(IfOnStopCalled){
  //Do your action
}
else{
 //Do your action
}
Другие вопросы по тегам