Жизненный цикл активности Android: проблемы с Onstop () - PullRequest
1 голос
/ 10 октября 2019

Итак, в основном я хочу просто изменить некоторые значения в базе данных, когда приложение свернуто или остановлено!

Вот так выглядит мой код:

  @Override
    protected void onStop() {
        super.onStop();

        FirebaseUser currentUser = mAuth.getCurrentUser();

        if(currentUser != null) {

            mUserRef.child("online").setValue(ServerValue.TIMESTAMP);

        }

    }

Нопроблема в том, что когда я вызываю startActivity (startInten), т. е. перехожу ко второму намерению, этот метод также вызывается в это время. Я много исследовал в Интернете. Может кто-нибудь сказать мне, какой метод жизненного цикла активности вызывается только тогда, когда приложение свернуто и убито, а не когда мы собираемся выполнять другие действия в том же приложении?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 октября 2019

Еще один надежный способ справиться с этим - использовать для этого Сервис, который выполняет вашу задачу при закрытии приложения. Это можно использовать так:

Класс обслуживания:

public class CloseService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) { 
        //use the relevant code here that should be executed when the app is closed
        stopSelf();
    }
}

Также необходимо зарегистрировать Сервис в manifest.xml, например:

<manifest
    <application  
        </activity>

        <service android:name=".CloseService"/>

    </application>
</manifest>
3 голосов
/ 10 октября 2019

Вы должны использовать ProcessLifecycleOwner из библиотеки жизненного цикла Android и наблюдать его из метода класса приложения onCreate.

Пример кода (на kotlin):

ProcessLifecycleOwner.get().lifecycle.addObserver(object : LifecycleObserver{
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun onStop(){
            val currentUser = mAuth.getCurrentUser()
            if (currentUser != null) {
                mUserRef.child("online").setValue(ServerValue.TIMESTAMP)
            }
        }
    })

Пример кода (на Java):

ProcessLifecycleOwner.get().getLifecycle().addObserver(new LifecycleObserver() {
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        public void onStop(){
            FirebaseUser currentUser = mAuth.getCurrentUser();
            if(currentUser != null) {
                mUserRef.child("online").setValue(ServerValue.TIMESTAMP);
            }
        }
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        public void onStart(){
            //onstart action here
        }
}

Это будет вызвано, когда последнее действие вызвало onStop и приложение переместилось в фоновый режим или было убито.

...