蓝牙激活屏幕旋转后弹出警示对话框次数增多

7

我遇到了一个奇怪的问题。在Activity 的 onStart() 方法中,我通过Intent请求启用蓝牙并设置120秒的可发现性:

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(activateBTIntent, BT_ACTIVATE_INTENT);                                   

我无论蓝牙是否已经启用都使用它。Android文档说如果没有启用蓝牙,它将被激活,并且这个方案很好。在两种情况下,我都会得到系统警告对话框。
当我旋转屏幕时,我观察到闪烁。按下Yes/No按钮会删除一个对话框,但下面仍有另一个对话框。执行屏幕旋转时,我可以得到一堆警告对话框,并且必须按下每个对话框上的Yes/No才能摆脱它们。
只有在意图发送时蓝牙尚未启动时,才存在所描述的问题,否则它可以正常工作。在不同的2.2手机上尝试过,所有手机都存在此问题。看起来像是Android系统问题。
是否有人也遇到了这个问题,并且可能有一些有用的提示如何避免这个问题?
谢谢和问候。
4个回答

2

这是设置应用程序中存在的一个错误。RequestPermissionActivity在旋转时会复制其RequestPermissionHelperActivity实例。


非常感谢。我已经寻找了很长时间。干杯。 - Zelimir

1

我也曾面临同样的问题。花费了很多时间之后,我找到了一个解决方案。

您可以通过使用activateBTIntentFLAG_ACTIVITY_NO_HISTORY标志来避免重复弹出"蓝牙激活提示对话框"。 但是设置此标志将无法使用startActivityForResult

代码示例:

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
activateBTIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(activateBTIntent);

使用FLAG_ACTIVITY_NO_HISTORY与activateBTIntent一起使用,将从历史堆栈中移除“蓝牙激活警报对话框”活动。因此,在这种情况下,当方向改变时,“蓝牙激活警报对话框”活动将被结束并重新创建(而不是重复创建):

Reference http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY


1
问题在于通常需要使用startActivityForResult()。这样,当用户在系统蓝牙激活提示上按下“是”或“否”时,您会得到通知。如果用户选择“否”,该怎么办?您可以尝试一件事情。将启动蓝牙意图的活动限制为仅纵向(在您的清单中)。也许您可以避免这个问题。如果您需要处理两种方向,并在纵向/横向上呈现不同的布局,则我的建议无用。 - Zelimir
@Zelimir 你说得没错,而且它在工作。当用户点击是时蓝牙会被启用,当用户点击否时蓝牙保持关闭状态。只有当你使用onActivityResult执行某些操作时才会出现问题。 - Vivek
是的,那正是我所面临的问题。我的进一步操作取决于用户的是/否选择。但是,如果这对你不重要,我同意你已经有了解决方案。 - Zelimir

0

你的帖子信息不够详细,所以我在这里做出一些假设...

我对startActivityForResult不是很确定。

如果你使用了托管的AlertDialog,就不应该在onCreate()中执行showDialog()。如果蓝牙模块会这样做,你可以尝试不要从onCreate()运行上述代码。


我更新了我的帖子以使其更加精确。感谢您的建议。Intent是从onStart()发送的,因此这不是原因。 - Zelimir

0

该问题已经被报告(谷歌问题跟踪器),但在6年后仍然存在(在Android 7.1.2上进行了检查)。

不幸的是,标志FLAG_ACTIVITY_NO_HISTORY不再起作用。我找到的唯一快速解决方法,直到Android团队修复此问题(如果他们愿意),就是锁定活动屏幕方向更改,只是为了显示对话框的时间:

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);

在之前被调用

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

然后使用

public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == REQUEST_ENABLE_BT) {
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
  }
  super.onActivityResult(requestCode, resultCode, data);
}

在意图结果中进行处理。这是一个临时的解决方案,但通常比在BT激活期间显示可能的问题要好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接