Как я могу удалить документ Firebase, когда пользователь нажимает кнопку питания - PullRequest
1 голос
/ 28 февраля 2020

Мое приложение должно удалить документ Firebase, когда пользователь покидает текущую активность, например, когда он нажимает кнопку «Домой» (go на заднем плане) или кнопку «Питание». Следующий код работает нормально при нажатии Home, но ничего не делает при нажатии кнопки Power:

protected void onPause() {
    super.onPause();
    // Remove player from players list.
    if (mPlayerDocRef != null) mPlayerDocRef.delete();
    if (mAuthStateListener != null) mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
}

Поскольку delete () является асинхронным действием, я попытался добавить обратные вызовы следующим образом:

if (mPlayerDocRef != null) 
    mPlayerDocRef.delete()
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                if (mAuthStateListener != null) mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                 Log.w(TAG, "Error deleting document", e);
            }
        });

но обратные вызовы никогда не будут вызваны. Есть идеи, в чем проблема?

ОБНОВЛЕНИЕ: Я тестировал на реальных Samsung Galaxy Tab A (Android 9) и Samsung Note 8 (* 1016) * 6.0.1) и там нет проблем, только с Pixel 2 (Android 10). Может быть ошибка в ОС.

1 Ответ

2 голосов
/ 28 февраля 2020

onPause ()

Система вызывает этот метод как первый признак того, что пользователь покидает вашу активность (хотя это не всегда означает, что активность уничтожается); это указывает на то, что активность больше не находится на переднем плане (хотя она все еще может быть видимой, если пользователь находится в многооконном режиме). Используйте метод onPause () для приостановки или настройки операций, которые не должны продолжаться (или должны продолжаться в режиме модерации), когда действие находится в состоянии «Приостановлено» и ожидается, что вы вскоре возобновите его.

Отключение телефон, я думаю, технически может не возобновиться в ближайшее время. Я знаю, что на некоторых телефонах анимация «отключена», и в этих случаях вы получаете onPause.

Но попробуйте также onStop или onDestroy:

onStop ()

Когда ваша активность больше не видна пользователю, она перешла в состояние Stopped, и система вызывает обратный вызов onStop (). Это может произойти, например, когда вновь запущенное действие охватывает весь экран. Система может также вызвать onStop (), когда действие завершится, и должно быть прекращено .

При уничтожении я менее убежден, так как документы говорят, что это не так гарантированно будет вызван:

onDestroy ()

onDestroy () вызывается до уничтожения действия. Система вызывает этот обратный вызов либо потому, что:

  • действие завершается (из-за того, что пользователь полностью отклонил действие, либо из-за вызова fini sh () для действия), либо
  • Система временно разрушает активность из-за изменения конфигурации (например, ротация устройства или многооконный режим)

Вы также можете зарегистрировать приемник вещания для событий отключения:

    <intent-filter>
        <action android:name="android.intent.action.ACTION_SHUTDOWN"/>
        <action android:name="android.intent.action.QUICKBOOT_POWEROFF"/>
    </intent-filter>

Поведение BroadcastReceiver для ACTION_SHUTDOWN

Попробуйте зарегистрировать BroadcastReceiver программно также с помощью Activity.registerReceiver(), чтобы получить обратный вызов в своей деятельности.

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