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