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的主要内容,如果未能解决你的问题,请参考以下文章