Проверьте, вызывается ли активность 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
}