当前位置: 首页 > 知识库问答 >
问题:

从服务启动AlertDialog.Builder

宰父学
2023-03-14

我正试图通过使用AlertDialog.Builder从服务启动复选框对话框,但遇到以下错误:

当我在没有builder.getwindow().settype()的情况下启动对话框时出现此错误:

05-28 10:48:42.816: E/AndroidRuntime(18510): FATAL EXCEPTION: main
05-28 10:48:42.816: E/AndroidRuntime(18510): Process: com.bustracker, PID: 18510
05-28 10:48:42.816: E/AndroidRuntime(18510): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
05-28 10:48:42.816: E/AndroidRuntime(18510):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:691)
05-28 10:48:42.816: E/AndroidRuntime(18510):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
05-28 10:48:42.816: E/AndroidRuntime(18510):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
05-28 10:48:42.816: E/AndroidRuntime(18510):    at android.app.Dialog.show(Dialog.java:312)
05-28 10:48:42.816: E/AndroidRuntime(18510):    at android.app.AlertDialog$Builder.show(AlertDialog.java:991)
05-28 10:48:42.816: E/AndroidRuntime(18510):    at com.bustracker.TrackingService.stop_popup(TrackingService.java:370)
05-28 10:48:42.816: E/AndroidRuntime(18510):    at com.bustracker.TrackingService.onAsyncTaskFinished(TrackingService.java:305)

我尝试用builder.getwindow().settype(Windowmanager.layoutparams.type_system_alert);

private void stop_popup(final ArrayList<Integer> routeList) {


    int routeListSize = routeList.size();

    if (routeListSize > 0) {

        String[] charSequence = new String[routeList.size()];
        for (int i = 0; i < routeList.size(); i++) {
            charSequence[i] = String.valueOf(routeList.get(i));
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle("Has this route arrived the stop? ");

        builder.setMultiChoiceItems(charSequence, null,
                new DialogInterface.OnMultiChoiceClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which,
                            boolean isChecked) {

                        if (isChecked) {

                            route_number = routeList.get(which);

                        }  
                    }
                });

        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {

                    }
                });
        builder.setNegativeButton(android.R.string.cancel,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {

                    }
                });

        builder.create();
        builder.show();
    }
}

共有1个答案

卫飞鹏
2023-03-14

如果您想在Android服务中弹出一个对话框,您有两种方法:

>

  • 使用活动作为对话框

    使用alertdialog.builder,但是您需要使用dialog.getwindow().settype(Windowmanager.layoutparams.type_system_alert)将对话框配置为系统警报;

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Test dialog"));
    builder.setIcon(R.drawable.icon);
    builder.setMessage("Content");
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            //Do something
            dialog.dismiss();
    });
    builder.setNegativeButton("Close", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.dismiss();
        }
    });
    AlertDialog alert = builder.create();
    alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    alert.show();
    
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    

  •  类似资料:
    • 问题内容: 我们如何从Java启动/停止Windows服务?例如,我想从Java启动和停止mysql Windows服务。 如果可以启动/停止,那么是否可以知道服务是否成功启动? 问题答案: 您可以使用字符串数组来制定命令提示符脚本来启动,停止和检查服务状态: 使用以下命令执行脚本:

    • 问题内容: 从我在Stack Exchange和其他地方看到的所有内容中,我已经正确设置了所有内容,可以在启动Android OS时启动IntentService。不幸的是,它没有在启动时启动,并且我没有收到任何错误。也许专家可以帮忙… 表现: 用于启动的BroadcastReceiver: 更新:我尝试了下面的几乎所有建议,并;在处理程序中添加了日志记录,但从未记录过任何内容。因此,它甚至还没有

    • 我正试图通过以下命令从ADB启动服务- 我得到以下回应

    • 主要内容:通过计算机管理方式,通过命令行方式MySQL 服务和 MySQL 数据库不同,MySQL 服务是一系列的后台进程,而 MySQL 数据库则是一系列的数据目录和数据文件。MySQL 数据库必须在 MySQL 服务启动之后才可以进行访问。本节主要介绍如何启动 MySQL 服务。 Windows 系统下启动停止 MySQL 服务的方式主要有以下两种: 通过计算机管理方式 通过命令行方式 通过计算机管理方式 通过 Windows 的服务管

    • Uragano支持Web Host,也支持Generic host Web host public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Versi

    • 我一直试图在我的docker容器中运行cron作业,但当容器启动时,我似乎无法让cron服务运行。我可以远程进入运行容器并运行“cron”以使服务在没有问题的情况下启动。我在我的DockerFile中包含了这个,为什么命令没有被执行呢? Docker-compose.yml