Подтвердить что ты не робот

Как определить, оставил ли пользователь мое приложение?

Я разрабатываю приложение для Android, и я хочу обнаружить, когда пользователь выходит из моего приложения, либо нажав кнопку "Назад", либо кнопку "Домой".

Кроме того, событие, подобное onInit(), было бы полезно в моем сценарии, так как я просто хочу сначала запустить действие MyInıt.

onDestroy() не вызывается, пока другим приложениям не потребуется больше памяти.

4b9b3361

Ответ 1

Если ваша деятельность является последней в стеке, то обнаружение кнопки "Назад" с помощью onKeyDown разрешит 1/2 этого

Домашний ключ немного сложнее, нет абсолютного метода, но вы можете сделать что-то подобное, что работает для моих простых потребностей.

OnUserLeaveHint вызывается в соответствии с документацией, когда пользователь нажимает кнопку "домой" или когда что-то прерывает ваше приложение (например, входящий телефонный звонок), поэтому, чтобы догадаться, какой именно вы используете метод onUserInteraction для отметки времени последнего взаимодействия с пользователем.

Теперь, если это слишком близко к onUserLeaveHint, вы можете предположить (не гарантированный, но работал у меня до сих пор), что кнопка дома была причиной, по которой ваше приложение выталкивается в фоновый режим (выход)

Не уверен, что ваше намерение заключается в том, чтобы поймать кнопку дома, так или иначе, это упрощенный способ сделать это, я использую забор на 100 мс вокруг двух событий, которые я нашел, всегда работал у меня. ПРИМЕЧАНИЕ. Я тестировал только на нескольких телефонах, как и все на Android, ваш пробег будет зависеть от OS/Hardware (черт возьми даже материал, который документирован и должен работать иногда)

long userInteractionTime = 0;

@Override
public void onUserInteraction() {
    userInteractionTime = System.currentTimeMillis();
    super.onUserInteraction();
    Log.i("appname","Interaction");
}

@Override
public void onUserLeaveHint() {
    long uiDelta = (System.currentTimeMillis() - userInteractionTime);

    super.onUserLeaveHint();
    Log.i("bThere","Last User Interaction = "+uiLag);
    if (uiDelta < 100)
        Log.i("appname","Home Key Pressed");    
    else
        Log.i("appname","We are leaving, but will probably be back shortly!");  
}

Ответ 2

Примечание. Это работает только в том случае, если ваша цель → = API14


Вы также можете использовать Application.registerActivityLifecycleCallbacks(), и когда какое-либо действие приостанавливает отправку задержанного Runnable (который будет вызываться, когда пользователь оставит приложение) до Handler. Когда действия создаются/запускаются/возобновляются, вы удаляете это Runnable из Handler. Поэтому, когда вы перемещаетесь внутри своего приложения, вы всегда отменяете это Runnable, но если активируется другое действие не из вашего приложения - будет вызван Runnable.

Я использовал это для выхода из системы, когда он оставил мое приложение, здесь код для обратных вызовов:

public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {

    private Handler handler;
    private Runnable runLogout = new Runnable() {
        @Override
        public void run() {
            //logoutUser()
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();

        registerActivityLifecycleCallbacks(this);
        handler = new Handler(getMainLooper());
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        handler.removeCallbacks(runLogout);
    }

    @Override
    public void onActivityStarted(Activity activity) {
        handler.removeCallbacks(runLogout);
    }

    @Override
    public void onActivityResumed(Activity activity) {
        handler.removeCallbacks(runLogout);
    }

    @Override
    public void onActivityPaused(Activity activity) {
        handler.postDelayed(runLogout, 1000);
    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
}

Однако Runnable будет выполняться не в контексте жизненного цикла активности, поэтому для использования этого в действии вам нужно будет установить и проверить какой-либо флаг всей заявки или передать намерение.

Ответ 3

OnUserLeaveHint вызывается в соответствии с документацией, когда пользователь нажимает кнопку "домой" или когда что-то прерывает ваш приложение (например, входящий телефонный звонок), чтобы догадаться, что это вы используйте метод onUserInteraction для штамповки последнего взаимодействия с пользователем время.

Просто небольшая поправка к ответу "Идистик" - OnUserLeaveHint() вызывается не, когда ваша активность прерывается входящим вызовом. Вот фрагмент из документации для Android -

Вызывается как часть жизненного цикла деятельности, когда активность выходят в фоновом режиме в результате выбора пользователя. Например, когда пользователь нажимает клавишу "Домой", вызывается onUserLeaveHint(), но когда входящий телефонный вызов вызывает активность по вызову автоматически выводится на передний план, onUserLeaveHint() не будет вызвал прерывание активности.

Ответ 4

Да, проверьте жизненный цикл приложения - когда пользователь минимизирует или покидает пару методов, вызываемых OnPause() OnStop() и onDestroy()

http://developer.android.com/reference/android/app/Activity.html

Ответ 5

другой вариант, который вы можете рассмотреть, - это проверить кнопку "Назад" или "Домашний". Это делается путем переопределения onKeyDown(), прослушивания заднего ключа/домашнего ключа и переопределения поведения по умолчанию.

Я нашел аналогичный вопрос, который может помочь вам.

Android: подскажите пользователю сохранить изменения при нажатии кнопки "Назад"

Приветствия