Я публикую это, потому что на устройстве HUAWAI Prism II Android 4.1.1 (API 16) игра, на которой я работаю (http://www.playlunapuma.com), имела следующие раздражающие свойства:
Я показываю свое главное меню, которое имеет некоторую анимацию в SurfaceView и время от времени воспроизводит звук.
Устройство отключается, затемняется и затем гаснет.
Он вызывает onDestroy
для моей активности, а затем , когда экран выключен снова создает мою активность, вызывая onCreate
!
Так что проблема в том, что моя анимация и звуки воспроизводятся при выключенном экране. Я действительно хочу, чтобы цикл анимации вообще не работал, если экран выключен. Приемники вещания не работают, потому что я не могу сохранить состояние с момента последнего отключения экрана. Я думал о некоторых хакерских атаках со статическими логическими значениями, но это только казалось, что kluge может не работать и иметь ужасные крайние случаи. Экран уже выключен, когда снова создается моя активность, поэтому через широковещательный приемник я не получу сообщение о том, что мой экран выключен.
Я решил это, используя и широковещательный приемник, и код, указанный выше.
В моем onCreate
я создаю широковещательный приемник. Это будет контролировать мой цикл анимации при включении и выключении экрана.
if (mScreenReceiver == null) {
mScreenIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
mScreenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
mScreenReceiver = new ScreenReceiver();
registerReceiver(mScreenReceiver, mScreenIntentFilter);
}
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
controlAnimLoop(false, false, true);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
controlAnimLoop(false, false, false);
}
}
}
В моем элементе управления AnimLoop я проверяю isScreenOn
, это код:
private boolean isScreenOn() {
if (android.os.Build.VERSION.SDK_INT >= 20) {
// I'm counting
// STATE_DOZE, STATE_OFF, STATE_DOZE_SUSPENDED
// all as "OFF"
DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays ()) {
if (display.getState () == Display.STATE_ON ||
display.getState () == Display.STATE_UNKNOWN) {
return true;
}
}
return false;
}
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
return powerManager.isScreenOn();
}