Есть ли способ справиться с активным переключателем задач?
Итак, наше приложение обрабатывает, когда приложение переходит в фоновый режим через этот хак, найденный в другом месте:
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
чтобы проверить, как ваше приложение было отправлено в фоновый режим при отключении экрана или пользователем. Если вы хотите больше информации о том, как это сделать. Комментарий ниже.