Есть ли способ справиться с активным переключателем задач?

Итак, наше приложение обрабатывает, когда приложение переходит в фоновый режим через этот хак, найденный в другом месте:

 public static boolean isAppGoingToBackground(Context context)
    {
        boolean retVal = false;
        ActivityManager mgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTasks = mgr.getRunningTasks(1);
        if (!runningTasks.isEmpty())
        {
            // If the package name of the current activity doesn't equal the context's
            // package name, then the user is no longer in the context's app.
            ComponentName currentActivity = runningTasks.get(0).topActivity;
            retVal = !currentActivity.getPackageName().equals(context.getPackageName());
        }
        return retVal;
    }

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

_receiver = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                if(intent.getAction() == Intent.ACTION_SCREEN_ON)
                {
                    //resume
                }
                else if(intent.getAction() == Intent.ACTION_SCREEN_OFF)
                {
                    handleAppGoingToBackground(_context);
                }
            }
        };

Однако ни один из них не дает правильного ответа, когда пользователи справляются с приложением, используя переключатель задач:

введите описание изображения здесь

Если вы создаете фоновое приложение таким образом, isGoingToBackground возвращает false. Я надеялся, что в приемнике вещания было другое событие, которое я мог бы использовать для обработки этого события, но я ничего не нашел. Есть ли способ узнать в вашем приложении, когда оно работает таким образом?

2 ответа

Решение

Итак, я получил рабочее решение, я использовал немного другой подход к использованию вызова getTasks, поскольку он устарел. Кажется, это работает для всего, что я тестировал до сих пор, но я продолжу тестировать, чтобы увидеть, есть ли у меня какие-либо другие проблемы. По сути, все мои действия имеют суперкласс, определенный как таковой:

public abstract class BaseActivity extends AppCompatActivity
{
    boolean isStartingActivity = false;
    boolean appWentToBackground = false;
    @Override
    protected void onPostResume()
    {
        super.onPostResume();

        if (appWentToBackground) 
        {
            appWentToBackground = false;
            handleAppComingToForeground();
        }
    }

    @Override
    protected void onStop()
    {
        super.onStop();
        if (!isFinishing() && !isStartingActivity && getChangingConfigurations() == 0)
        {
            appWentToBackground = true;
            //If all of the above is true the app must be going to background
            handleAppGoingToBackground();
        }
        isStartingActivity = false;
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode, Bundle options)
    {
        isStartingActivity = true;
        super.startActivityForResult(intent, requestCode, options);
    }

    @Override
    public void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)
    {
        isStartingActivity = true;
        super.startActivityFromFragment(fragment, intent, requestCode);
    }
}

Мысленный процесс состоит в том, что проверка ChangingConfigs обрабатывает поворот, isFinishing обрабатывает нажатие назад (он не обрабатывает возврат к точке нахождения в другом приложении, но в моем случае это нормально), а isStartingActivity обрабатывает случай, на который я перехожу другое действие, если все эти условия выполнены, это должно означать, что я в той или иной форме фоновый (работает для меня для переключения приложений и нормального фона).

Я буду обновлять, если я замечу что-нибудь еще, что может использовать улучшения, или случаи, которые я пропустил.

Я бы порекомендовал использовать onPause() метод. Так что, если ваше приложение переходит в "мешки" onPause() метод называется. Это так же, как onCreate() и ваше приложение просто запускает метод onPause() всякий раз, когда ваше приложение переходит в фоновый режим. Вы также можете использовать BroadcastReceiver чтобы проверить, как ваше приложение было отправлено в фоновый режим при отключении экрана или пользователем. Если вы хотите больше информации о том, как это сделать. Комментарий ниже.

Другие вопросы по тегам