屏幕旋转后蓝牙激活警报对话框倍增

时间:2011-02-02 10:57:23

标签: android

我遇到了奇怪的问题。来自Activity onStart()我通过意图请求蓝牙激活和120s可发现性:

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

无论蓝牙是否已经激活,我都会使用它。 Android文档说,如果不是蓝牙将被激活,并且工作正常。在这两种情况下,我都会收到系统警报对话框

enter image description here

当我旋转屏幕时,我观察到闪烁。按是/否删除一个对话框,但下面还有另一个对话框。执行屏幕旋转我可以获得一堆警报对话框,并且必须按每个上的是/否来清除它们。

只有在发送意图时尚未启动蓝牙时才会出现所描述的问题,否则它会正常工作。试过不同的2.2手机,所有问题都存在。在我看来就像Android系统一样。

有没有人遇到过它,也许有一些有用的提示如何避免这种情况?

谢谢和问候。

4 个答案:

答案 0 :(得分:2)

这是导致此问题的“设置”应用中的错误。 RequestPermissionActivity在轮换时复制其RequestPermissionHelperActivity实例。

答案 1 :(得分:1)

我遇到了同样的问题。在花了很多时间之后,我找到了一个解决方案。

您可以使用避免重复“蓝牙激活警报对话框” activateBTIntent FLAG_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一起使用将从历史堆栈中删除“蓝牙激活警报对话框”活动。因此,在这种情况下,当方向更改时,“蓝牙激活警报对话框”活动将完成并且newel创建(NOT DUPLICATED):

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

答案 2 :(得分:0)

(你的帖子几乎没有足够的信息,所以我假设在这里...)

我对startActivityForResult不太了解。

如果使用托管的AlertDialog,则不应在onCreate()中执行showDialog()。如果蓝牙东西这样做,你可以尝试不从onCreate()运行上面的代码吗?

答案 3 :(得分:0)

已报告此问题(google issue tracker)但已在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激活期间显示这个可能的问题更好。