当我收到来自不同线程的消息时,我需要一个弹出对话框,但对话框应该不依赖于Activity,即它应该在屏幕焦点所在的位置显示对话框。
可以吗?因为对话框是根据Activity处理的,所以我想到了使用服务,但是又一次添加了一个线程,我想避免这种情况。
还有其他选择吗?
答案 0 :(得分:17)
如果您尝试询问当您的活动不是用户手机上的重点活动时如何显示对话框,请尝试使用通知。在不同的应用程序上弹出对话框会在用户执行其他操作时中断用户。来自Android UI guidelines:
使用通知系统 - 请勿使用 使用对话框代替 通知强>
如果您的后台服务需要 通知用户,使用标准 通知系统 - 不要使用 对话或吐司通知他们。一个 对话或吐司会立即采取 重点关注并打断用户 远离他们正在做的事情: 用户可能在中间 在对话框的那一刻输入文字 出现并可能意外地采取行动 对话框。用户习惯于交易 通知,可以拉下来 他们的通知阴影 方便回应你的 消息。
创建通知的指南在此处:http://developer.android.com/guide/topics/ui/notifiers/notifications.html
答案 1 :(得分:1)
替代解决方案:
AlertDialog dialog;
//add this to your code
dialog = builder.create();
Window window = dialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.token = mInputView.getWindowToken();
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
//end addons
alert.show();
答案 2 :(得分:1)
如果我理解正确,您可以为所有活动使用基类
public abstract class BaseActivity extends Activity{
protected static BaseActivity current_context = null;
@override
protected void onPause(){
current_context = null;
super.onPause();
}
@override
protected void onResume(){
current_context = this;
super.onResume();
}
public static void showDialog(/*your parameters*/){
//show nothing, if no activity has focus
if(current_context == null)return;
current_context.runOnUiThread(new Runnable() {
@override
public void run(){
AlertDialog.Builder builder =
new AlertDialog.Builder(current_context);
//your dialog initialization
builder.show();
}
});
}
}
在您的主题中显示与BaseActivity.showDialog(..)
的对话框但如果您想在目标设备的任何活动之上显示对话框,则此方法无效。