2015-03-17 2 views
2

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

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

protected void createOverlay(){ 
    if (overlayCreated) return; 

    // Create System overlay video 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.FILL_PARENT, 150, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
      PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.BOTTOM; 

    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    mOverlay = (LinearLayout) inflater.inflate(R.layout.overlay_notification, null); 
    mOverlayImageView = (ImageView) mOverlay.findViewById(R.id.overlay_notification_image); 

    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
    wm.addView(mOverlay, params); 

    final Context context = this; 

    mOverlay.setOnTouchListener(new View.OnTouchListener(){ 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Toast.makeText(context, "WootHa!", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
    }); 
} 

Уничтожить

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    // Remove view from WindowManager 
    if (mOverlay != null) { 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.removeView(mOverlay); 

     mOverlay = null; 
     mOverlayImageView = null; 
    } 
} 

Ошибка:

26576-26576/com.letstruck.mygauges E/WindowManager﹕ android.view.WindowLeaked: Activity com.letstruck.mygauges.ui.activity.fuel.TruckListActivity has leaked window android.widget.LinearLayout{431c4220 V.E..... ......I. 0,0-1080,150} that was originally added here 
      at android.view.ViewRootImpl.<init>(ViewRootImpl.java:457) 
      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:267) 
      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
      at com.letstruck.mygauges.ui.activity.LoggedInActivity.createOverlay(LoggedInActivity.java:125) 
      at com.letstruck.mygauges.ui.activity.LoggedInActivity.onOptionsItemSelectedMain(LoggedInActivity.java:186) 
      at com.letstruck.mygauges.ui.activity.fuel.TruckListActivity.onOptionsItemSelected(TruckListActivity.java:100) 
      at android.app.Activity.onMenuItemSelected(Activity.java:2687) 
      at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:373) 
      at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1103) 
      at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
      at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
      at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
      at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:177) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:308) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1483) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3485) 
      at android.widget.AbsListView$3.run(AbsListView.java:4843) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:157) 
      at android.app.ActivityThread.main(ActivityThread.java:5356) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

'onDestroy' не может быть вызван, вероятно, вы должны удалить окно в' onPause' – tachyonflux

+0

Добавлено в onPause(), все еще просочилось. Я отлаживал его, чтобы проверить, что этот код вызывается. Что-то не так с моим методом освобождения? – Xeridea

+0

Поместить полный код –

ответ

2

Я была такая же проблема. В моем случае я использовал wm.removeViewImmediate (View) вместо removeView (View), который решил мою проблему. Может быть, вы можете попробовать.

+0

PS: Я сделал еще один тест и обнаружил, что эта проблема с утечкой происходит только на версии Android версии 4.4. Перед 4.4, removeView() в порядке. – popo

Смежные вопросы