您可以通过将窗口类型设置为
TYPE_SYSTEM_ALERT
,从服务中显示
Dialog
。记得使用传递给
onJsAlert
的
JsResult
实例向用户返回所采取的操作。
private JsResult mResult;
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
mResult = result;
AlertDialog dialog = new AlertDialog.Builder(MyService.this)
.setTitle("Custom Dialog")
.setMessage("This is our custom dialog, not the one served by JsDialogHelper")
.setOnCancelListener(new CancelListener())
.setNegativeButton("Cancel", new CancelListener())
.setPositiveButton("Ok", new PositiveListener())
.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
return true;
}
});
private class CancelListener implements DialogInterface.OnCancelListener,
DialogInterface.OnClickListener {
@Override
public void onCancel(DialogInterface dialogInterface) {
mResult.cancel();
}
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mResult.cancel();
}
}
private class PositiveListener implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mResult.confirm();
}
}
在清单文件中添加所需的权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
备选方案:
如果Web应用程序可以针对Android WebView构建,那么您可以创建JavaScript接口,使得JavaScript代码能够直接调用Android代码,从而为您显示对话框。这避免了使用JsDialogHelper
的方法。
- 定义一个JavaScript接口:
public class WebAppInterface {
Context context;
WebAppInterface(Context c) {
context = c;
}
@JavascriptInterface
public void showDialog() {
AlertDialog dialog = new AlertDialog.Builder(context)
.setTitle("Custom Dialog")
.setMessage("This is our custom dialog, not the one served by JsDialogHelper")
.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
}
}
- 使用addJavascriptInterface绑定Javascript和Android代码之间的接口。
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
- 在Javascript代码中使用该接口。
<input type="button" value="Display dialog" onClick="displayDialog()" />
<script>
function displayDialog() {
//alert("Javascript Dialog");
Android.showDialog();
}
</script>
</input>
something not attached to the activity lifecycle
。所以,例如,当这个功能处于活动状态时,用户必须能够在我们的应用程序中导航做其他事情
- 当然,你可以保留视图,只要你需要它。...但是我们正在使用的服务要求它是一个webview
- 好的 - 不要显示alertdialog,使用服务并使用WM添加视图。但是,我不确定这是否有帮助。 - Vikram