您的位置:首页 > 移动开发 > Android开发

android 创建系统级的Dialog时,无法使用Home关闭的问题

2013-12-12 22:57 585 查看
最近在工作中遇到需要在服务中创建一个Dialog的问题,由于Dialog需要创建在Activity之上,所有服务中直接new一个Dialog肯定是不行的.会提示Token为null的错误.

解决的办法就是设置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中的办法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐