android 创建系统级的Dialog时,无法使用Home关闭的问题
2013-12-12 22:57
585 查看
最近在工作中遇到需要在服务中创建一个Dialog的问题,由于Dialog需要创建在Activity之上,所有服务中直接new一个Dialog肯定是不行的.会提示Token为null的错误.
解决的办法就是设置TYPE_SYSTEM_ALERT:
上面代码中自定义了一个Dialog,在service中启动该dialog,可以使用mWindow.setType(LayoutParams.TYPE_SYSTEM_ALERT);也可以使用attributes.type = LayoutParams.TYPE_SYSTEM_ALERT;
但是如果只是设置了TYPE_SYSTEM_ALERT,你会发现,点击Home键,该窗口无法关闭,而且在Dialog中重写onKeyDown也不行,因为Home键系统截获了..
这个时候我们就需要使用广播了,因为系统处理Home键时是发了广播的,我们可以注册Intent.ACTION_CLOSE_SYSTEM_DIALOGS来获取到点击Home键时发送的广播,参考CloseSystemDialogsReceiver中的办法.
解决的办法就是设置TYPE_SYSTEM_ALERT:
public class CustomDialog extends Dialog { private CloseSystemDialogsReceiver mCloseSystemDialogsReceiver; private Window mWindow; public CustomDialog(Context context) { super(context); setContentView(R.layout.view_custom); mWindow = this.getWindow(); LayoutParams attributes = mWindow.getAttributes(); attributes.width = mWindow.getWindowManager().getDefaultDisplay() .getWidth(); attributes.height = LayoutParams.MATCH_PARENT; mWindow.setType(LayoutParams.TYPE_SYSTEM_ALERT); IntentFilter filter = new IntentFilter( Intent.ACTION_CLOSE_SYSTEM_DIALOGS); mCloseSystemDialogsReceiver = new CloseSystemDialogsReceiver(); mWindow.getContext().registerReceiver(mCloseSystemDialogsReceiver, filter); } private class CloseSystemDialogsReceiver extends BroadcastReceiver { final String SYSTEM_DIALOG_REASON_KEY = "reason"; final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) { CustomSymbolDialog.this.dismiss(); mWindow.getContext().unregisterReceiver(mCloseSystemDialogsReceiver); } } } } }
上面代码中自定义了一个Dialog,在service中启动该dialog,可以使用mWindow.setType(LayoutParams.TYPE_SYSTEM_ALERT);也可以使用attributes.type = LayoutParams.TYPE_SYSTEM_ALERT;
但是如果只是设置了TYPE_SYSTEM_ALERT,你会发现,点击Home键,该窗口无法关闭,而且在Dialog中重写onKeyDown也不行,因为Home键系统截获了..
这个时候我们就需要使用广播了,因为系统处理Home键时是发了广播的,我们可以注册Intent.ACTION_CLOSE_SYSTEM_DIALOGS来获取到点击Home键时发送的广播,参考CloseSystemDialogsReceiver中的办法.
相关文章推荐
- Android中使用file.createNewFile()无法创建文件的问题(例如保存拍照的图片到本地)
- Android Activity使用Dialog样式导致点击空白处自动关闭的问题解决
- 解决Linux无法创建新用户和/home目录下无法创建新目录的问题
- vmware虚拟机 centos创建完整克隆后 网卡无法使用问题解决
- Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
- Activity使用Dialog样式导致点击空白处自动关闭的问题
- Activity使用Dialog样式导致点击空白处自动关闭的问题
- Android 定位使用network provider无法定位的问题
- Android中关于系统Dialog无法全屏的问题(dialog样式)
- 解决Android关闭通知消息权限无法弹出Toast的问题
- Activity使用Dialog样式导致点击空白处自动关闭的问题
- Android开发-工具:Android Studio 怎么添加使用第三方jar包及无法编译的问题解决方法
- Android中使用百度地图无法将地图移动到当前位置的问题
- Android手机无法使用google地图的问题的解决方案
- DPF.Android.Native.Components.v2.8.1 for delphi xe6 使用DPFJAlertDialog遇到的问题
- 关于使用ADT-22.6.0版本,Eclipse中无法创建AVD的问题
- android Dialog无法获取窗口问题闪退
- 使用easeui dialog弹出框中使用CKeditor多次加载后无法编辑问题
- 关于android R.java文件无法创建的问题
- android 之 Fragment 中使用 DialogFragment 创建回调