При использовании Microsft Exchange Android активирует экран своего пароля, который пользователь должен передавать каждый раз, когда устройство включено.
Я делаю игру, которая использует SurfaceView, запускаемую потоком. Я использую много статических переменных. Если устройство выключено во время воспроизведения, когда я вернусь и введите пароль, экран игры покажет, но некоторые растровые изображения имеют неправильный размер и заморожены.
В журналах я вижу первое исключение NullPointerException с потоком, отличным от UI, а затем ANR. Похоже, что выключение устройства уничтожило некоторые объекты моего приложения, но оно снова не прошло через конструкцию WithCreate и SurfaceView, когда оно вернулось.
У меня нет проблем при приостановке игры с помощью phonecall или нажатием кнопки HOME. Кроме того, на двух других устройствах игра отлично работает после того, как вы их запустили и включили в середине игры, но у них нет экрана безопасности.
Я использую Galaxy Tab, os 2.2
EDIT: После печати stacktrace в потоке я получаю
android.graphics.Canvas.throwIfRecycled
Кажется, что некоторые из моих растровых изображений были переработаны. Любая идея, как обнаружить это в onResume или в surfaceChanged(), который всегда срабатывает при возврате в приложение?
В настоящее время мое решение этой проблемы заключается в закрытии этой операции, если она не возобновляется с правильной последовательностью событий. Если onSurfaceChanged происходит без первого события onSurfaceCreated, закройте это действие. Состояние игры все равно может быть сохранено, и когда игрок перезапустит это действие, он продолжит работу там, где он остановился.
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
//if it does not start through surfaceCreated close activity
// because some bitmaps could be recycled and crash the application
if (!surfaceCreatedFirst){
_thread.setRunning(false); //stop the thread
((Activity) context1).finish(); //close activity
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
surfaceCreatedFirst = true;
_thread = new FootballThread(holder, this);
_thread.setRunning(true);
_thread.start();
}