如何让服务将焦点更改为您的后台活动?

时间:2014-01-23 18:34:52

标签: java android android-service

很抱歉问这个。

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

问题是,当你连接蓝牙设备时,你通常在设置菜单中,而不是在我的应用程序中。我的服务将看到BluetoothDevice.ACTION_ACL_CONNECTED意图并尝试显示一个自然没有活动窗口的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)

这里我的onRecevie只是为了它的地狱:(我修剪并编辑它,可能有一个mmissing'}')

    @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();
                    }
                });
            }
        }
    }

任何人都有关于服务如何强制关注活动以便可以绘制对话的建议?或者,Android服务中是否有另一种提示或强制用户输入的方法? (我可以想到为什么需要这样做的十几个原因)

谢谢!

2 个答案:

答案 0 :(得分:1)

您只需通过Notification向用户显示Service,当用户选择Notification时,您只需启动您的活动,让用户执行相关任务到BlueTooth连接。

这是一个很好的实施Notifications的教程:
http://www.vogella.com/tutorials/AndroidNotifications/article.html

我希望这会有所帮助。

答案 1 :(得分:0)

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