android 弹出一个在桌面上出现的window
最近发现,如果我在Activity A的Handler里面写了消息处理事件,然后从Activity A跳转到界面B之后,A的handler还在继续处理消息,我的项目中,用户进入到房间界面了,开始接收消息,然后他也可以跳转到设置界面去进行一些房间设置,假如这个时候用户被强制T出去了,不管他在哪个界面,都需要弹出对话框显示用户被踢出,之前用的普通的Dialog,然后只有房间界面显示出来的时候才会看到被踢出去的对话框,在设置界面看不到这个,然后被测试提bug了。。。一直知道用window可以做,可是试了之后发现主要问题在于,一个是响应window的View上面的button点击事件,一个是响应系统的back回退事件,这两个要么一个都不响应,要么只能响应一种,在网上找了很久也没找到好的方法。。最后只能加了一个布尔变量来使back按键可以响应。
private WindowManager mWindowManager = null; private boolean isShow; private View view; public void showMsgWindow(String tipMessage, Context context) { mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = createParams(); view = View.inflate(context, R.layout.window, null); TextView message = (TextView) view.findViewById(R.id.window_message); Button cancel = (Button) view.findViewById(R.id.window_cancel); Button ok = (Button) view.findViewById(R.id.window_ok); message.setText(tipMessage); cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { removeWindowManager(); } }); ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { removeWindowManager(); } }); mWindowManager.addView(view, params); isShow = true; } public void removeWindowManager() { mWindowManager.removeView(view); isShow = false; } public WindowManager.LayoutParams createParams() { WindowManager.LayoutParams params = new WindowManager.LayoutParams(); // 类型 params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.format = PixelFormat.TRANSLUCENT; params.width = LayoutParams.MATCH_PARENT; params.height = LayoutParams.MATCH_PARENT; params.gravity = Gravity.CENTER; return params; }
//Activity的方法 @Override public void onBackPressed() { if (isShow) { removeWindowManager(); } else { super.onBackPressed(); } }
比较丑,勉强解决了问题。
========================更新
因为在小米华为等国产手机上可能会出现SYSTEM权限及以上的window被系统屏蔽掉的情况。。项目中已经改成了自定义action,发送LocalBroadcast的方式来启动一个Dialog风格的Activity,似乎没什么问题了。观察手机QQ的被挤下线的提示似乎也是这么一个Dialog风格的Activity。。。。