android.view.WindowManager$BadTokenException
Posted
技术标签:
【中文标题】android.view.WindowManager$BadTokenException【英文标题】: 【发布时间】:2016-11-26 01:33:01 【问题描述】:我通过使用窗口管理器添加视图来自定义应用程序中的通知。
: 无法添加窗口——令牌android.os.BinderProxy@74b2eff 无效;您的活动正在运行吗? 在 android.view.ViewRootImpl.setView(ViewRootImpl.java:685) 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:319) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 在 com.zuck3.petpolar.manager.InboxNotificationManager.showInboxNotification(InboxNotificationManager.java:82) 在 com.zuck3.petpolar.activity.Inbox.InboxActivity.onCreate(InboxActivity.java:66) 在 android.app.Activity.performCreate(Activity.java:6376) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:207) W/System.err:在 android.app.ActivityThread.main(ActivityThread.java:5728) W/System.err:在 java.lang.reflect.Method.invoke(Native Method) W/System.err:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) W/System.err:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) W/libEGL:[ANDROID_RECORDABLE] 格式:1
InboxNotificationManager.java
public class InboxNotificationManager
private static InboxNotificationManager instance;
private WindowManager mWindowManager;
private WindowManager.LayoutParams mWindowParams;
private InboxNotificationView notificationView;
private Runnable runnable;
private Handler handler = new Handler(Looper.getMainLooper());
private Animation.AnimationListener animationListener = new Animation.AnimationListener()
@Override
public void onAnimationStart(Animation animation)
@Override
public void onAnimationEnd(Animation animation)
hideInboxNotification();
@Override
public void onAnimationRepeat(Animation animation)
;
public static InboxNotificationManager Instance(Context context)
if (instance == null)
instance = new InboxNotificationManager(context);
return instance;
public InboxNotificationManager(Context context)
notificationView = new InboxNotificationView(context);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowParams = new WindowManager.LayoutParams();
mWindowParams.gravity = Gravity.TOP | Gravity.RIGHT;
mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowParams.width = WindowManager.LayoutParams.MATCH_PARENT;
mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
mWindowParams.format = PixelFormat.TRANSLUCENT;
runnable = new Runnable()
@Override
public void run()
notificationView.stopAnimation(animationListener);
;
public void setTextMeesage(String meesage)
notificationView.setTextMessage(meesage);
// Toast.makeText(InboxNotificationManager.this, "", Toast.LENGTH_SHORT).show();
public void showInboxNotification(String message)
if (notificationView.getWindowToken() == null)
mWindowManager.addView(notificationView, mWindowParams);
notificationView.startAnimation();
setTextMeesage(message);
else
// mWindowManager.setText(count);
notificationView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
notificationView.stopAnimation(animationListener);
);
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 3000);
public void hideInboxNotification()
if (notificationView.getWindowToken() != null)
mWindowManager.removeView(notificationView);
当我使用这个类时
InboxNotificationManager.Instance(BaseActivity.this).showInboxNotification("Hello world");
谢谢你,对不起我的英语不好。
【问题讨论】:
您是否在 SO 上查看了与此错误相关的其他答案?我找到了2-3。请分享您的整个onCreate
方法。
如果您的活动正在完成并且此时添加了视图,它将抛出此异常。因此,在显示视图/对话框之前,请检查活动中的if(!isFinishing())
。
感谢您的回答。但我想向我的自定义视图显示我想要的每一个活动,比如Toast。
【参考方案1】:
确保您的活动正在运行,使用
if(mActivity != null && !mActivity.isFinishing())
检查
【讨论】:
以上是关于android.view.WindowManager$BadTokenException的主要内容,如果未能解决你的问题,请参考以下文章