Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得一项服务,将重点转移到您的后台活动?_Java_Android_Android Service - Fatal编程技术网

Java 如何获得一项服务,将重点转移到您的后台活动?

Java 如何获得一项服务,将重点转移到您的后台活动?,java,android,android-service,Java,Android,Android Service,很抱歉问这个问题 我有一个Service BroadcastReceiver.onReceive(),它在蓝牙设备连接时侦听这些设备,并显示一个对话框,提示用户接受我的应用程序是否应该使用该设备 当然,问题是,当你连接蓝牙设备时,你通常在设置菜单中,而不是在我的应用程序中。我的服务将看到BluetoothDevice.ACTION\u ACL\u CONNECTED intent,并尝试显示一个AlertDialog,该对话框自然没有活动窗口: 02-23 13:22:19.099: E/And

很抱歉问这个问题

我有一个Service BroadcastReceiver.onReceive(),它在蓝牙设备连接时侦听这些设备,并显示一个对话框,提示用户接受我的应用程序是否应该使用该设备

当然,问题是,当你连接蓝牙设备时,你通常在设置菜单中,而不是在我的应用程序中。我的服务将看到BluetoothDevice.ACTION\u ACL\u CONNECTED intent,并尝试显示一个AlertDialog,该对话框自然没有活动窗口:

02-23 13:22:19.099: E/AndroidRuntime(25884): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-23 13:22:19.099: E/AndroidRuntime(25884):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:563)
02-23 13:22:19.099: E/AndroidRuntime(25884):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269)
02-23 13:22:19.099: E/AndroidRuntime(25884):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
02-23 13:22:19.099: E/AndroidRuntime(25884):    at android.app.Dialog.show(Dialog.java:281)
02-23 13:22:19.099: E/AndroidRuntime(25884):    at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
这里是我的onreceive(我剪辑并编辑了它,可能有一个mmissing'}'))

有人对服务如何强制关注活动以便绘制对话框有什么建议吗?或者安卓系统中是否有其他方法让服务提示或强制用户输入?(我可以想出十几个理由来说明为什么需要这样做)


谢谢

您只需通过
服务向用户显示
通知
,当用户选择该
通知
时,您只需启动活动,让用户执行与
蓝牙
连接相关的任务。

这是一个很好的实现
通知的教程:


我希望这会有所帮助。

我认为您应该使用具有适当意图的startActivity来启动您的活动或将其带到前台-然后活动会根据意图显示消息。您可以操纵意图上的标志,以指定切换到当前活动或为此目的创建新活动

很可能你只是想打电话给startActivity,为你的应用程序启动一个合适的活动。请查看下面的答案,如果它解决了你的问题,请接受它。谢谢你知道吗,你说得对。我已经使用通知来指示我的服务何时自行启动或重新启动。e、 g.当wifi IP发生变化时。我将处理这两个方面。1) 活动未处于活动状态时的通知。2) 当活动恢复时,我将显示对话框。谢谢你的建议。有时候你太接近了,太不耐烦了,看不到正确的答案。
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
            final BluetoothDevice btdevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (btdevice != null) {
                serviceHandler.post(new Runnable() {
                    public void run() {
                        new AlertDialog.Builder(getApplicationContext())
                            .setTitle("Bluetooth PAN detected")
                            .setMessage(
                                    "Do you want to connect to this device?\n" +
                                    "Name: " + btdevice.getName() + "\n" +
                                    "MAC: " + btdevice.getAddress())
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                                }}
                            ).setNegativeButton("No", null).show();
                    }
                });
            }
        }
    }