2013-11-26 3 views
1

Следующий рабочий код запускается в BroadcastReceiver, который принимает широковещательную передачу BOOT_COMPLETED.Прозрачный вид наложения «отпадает» от Window Manager?

//Create a transparent, untouchable view and attach it to the system-level Window Manager 
      //We will force this overlay into Landscape orientation. 
      final View view = new View(context); 
      int dimension = 0; 
      int pixelFormat = PixelFormat.TRANSLUCENT; 

      final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        dimension, dimension, 
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
          | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
        pixelFormat); 
      params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
      wm.addView(view, params); 

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

Моя проблема заключается в том, что иногда наложение исчезнет. Кажется, не существует конкретной причины. Это происходит из приложений, или иногда, казалось бы, случайным образом. Это возвращает его в портретный режим и вызывает проблемы.

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

Целевое устройство работает под управлением 4.0.3

ответ

1

Что может происходить в том, что с вашей точки зрения прилагается в BroadcastReceiver, само приложение, затем «остановлен» для остального времени и когда Android решает его требует памяти, полностью останавливает вас. На самом деле это не может быть причиной, так как у вас всегда отображается представление, но поскольку оно не является частью Activity, система может иметь дело с ним по-разному.

С тем, что вот то, что я хотел бы попробовать сделать:

Подкласс предпочтительную Посмотреть класс и переопределить onDetachedFromWindow() так Logs/печатает, когда вызывается метод. Если при исчезновении этого нечетного наложения возникает onDetachedFromWindow(), тогда определите способ повторного добавления View в WindowManager. Вы можете отправить широковещательную рассылку, которую будет получать BroadcastReceiver, или создать интерфейс Listener-like для отправки отдельного события. Интерфейс затем будет реализован с помощью долговременной части вашего приложения (службы).

Вы также можете увидеть, если OrientationEvenListener делает что-нибудь интересное, когда оверлей исчезает.

Если все остальное не удастся, вы можете повторно добавить просмотр. Не самое оптимальное решение, но оно гарантирует, что наложение снова появится.

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

+1

Спасибо, я попробую метод onDetachedFromWindow(). –

+1

Метод onDetachedFromWindow() не работал для меня, потому что приложение было остановлено в любом случае, но ваше предложение об использовании сервиса, похоже, действительно сделало трюк. Отмечено как принятый ответ. Спасибо. :) –