当前位置: 首页 > 知识库问答 >
问题:

WindowManager$BadTokenException

连时铭
2023-03-14

我通过使用windowmanager AddView在应用程序中自定义通知。

Android.view.WindowManager$BadTokenException:无法添加窗口--令牌Android.os.BinderProxy@74B2EFF无效;你的活动在进行吗?在Android.view.viewrootimpl.setView(viewrootimpl.java:685),在Android.view.windowmanagerlobal.addView(windowmanagerlobal.java:319),在Android.view.windowmanagerlobal.addView(windowmanagerlobal.java:85),在com.zuck3.petpol.manager.inboxNotificationmanager.showInboxNotificationmanager.java:82),在activityoncreate(instrumentation.java:1113)在Android.app.activitythread.performlaunchactivity(activitythread.java:2519)在Android.app.activitythread.handlelaunchactivity(activitythread.java:2654)在Android.app.activitythread.java:2654)在Android.app.activitythread.-Wrap11(activitythread.java:1488)在Android.os.handler.dispatchmessage(ythread.main(activitythread.java:5728)W/system.err:at java.lang.reflect.Method.invoke(本机方法)W/system.err:at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:789)W/system.err:at 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");

谢谢你,抱歉我的英语不好。

共有1个答案

冯哲彦
2023-03-14

确保您的活动正在运行,请使用

if(mActivity != null && !mActivity.isFinishing())

检查

 类似资料:
  • Examples // Opens a new dialog with the file.htm file and the size 320x240 // It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog. tinymce.active

  • 本文向大家介绍Android自定义Toast之WindowManager,包括了Android自定义Toast之WindowManager的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Android自定义Toast之WindowManager,供大家参考,具体内容如下 Toast:WindowManager 三个重要的API: public void addView(View view

  • 主要内容:本节引言:,1.WindowManager的一些概念:,2.WindowManager使用实例:,3.文献扩展:,4.本节代码示例下载:,本节小结:本节引言: 本节给大家带来的Android给我们提供的系统服务中的——WindowManager(窗口管理服务), 它是显示View的最底层,Toast,Activity,Dialog的底层都用到了这个WindowManager, 他是全局的!该类的核心无非:调用addView,removeView,updateViewLayout这几个方

  • 我正在向运行的activity添加一个带有WindowManager的相机覆盖。当我启动相机并调用WindowManager时,它将我的屏幕从纵向变为横向,即使我为WindowManager.LayoutParams分配了适当的纵向标记。还没能通过谷歌找到任何解决方案。 下面是我在服务中的方法中运行的WindowManager代码: 布局r.layout.camera只是我将相机添加到的Frame

  • 问题内容: 有什么方法可以使用Animation在Android的项目中使用WindowManager扩展视图吗?即使使用网站中的示例,我也做不到!我使用了许多示例,但没有一个有效! 问题答案: 我不确定您的任务的确切要求,但是有两种方法可以向窗口提供动画: 用法如下: 添加附加的“容器”视图,因为它不是真实的,因此添加视图的普通动画无法使用。已经问过这个问题,但是缺少代码。我将通过以下方式应用它

  • 本文向大家介绍Android使用WindowManager构造悬浮view,包括了Android使用WindowManager构造悬浮view的使用技巧和注意事项,需要的朋友参考一下 一般在android显示一个View都是通过Activity的setContentView设置的,但是还有一种方法,可以直接使用WindowManager在整个应用的最上层绘制我们需要显示的view,总体的效果类似于

相关文章

相关阅读