2

我已经修改了 SDK 演示中的蓝牙聊天示例,以便能够控制 arduino 供电的蓝牙 LED 矩阵。使用聊天程序,我可以通过蓝牙向显示器发送消息。我有一个问题。我做了两个屏幕布局,一个纵向和一个横向。这样,无论方向如何,我都可以让界面占据手机上的最大空间。

问题在于,如果手机旋转,则会调用 OnDestroy() 以重新加载新布局(横向或纵向)。在 OnDestroy() 例程中,如果蓝牙链接已建立,我还会销毁它:

   public void onDestroy() {
        super.onDestroy();
        // Stop the Bluetooth chat services
        if (mChatService != null)
            mChatService.stop();
        if (D)
            Log.e(TAG, "--- ON DESTROY ---");
    }

阅读此处的其他帖子,我发现您可以通过在清单中添加“android:configChanges="orientation"”来防止服务停止。这样做,当我旋转屏幕时,我到显示器的蓝牙链接不再终止,但是现在屏幕不会在横向模式下重绘。

为了解决这个问题,我正在考虑删除正在终止连接的“if mchatservice ...”部分,但是当应用程序最终退出时,我仍然需要运行代码。

有没有办法在旋转时重绘屏幕而不终止连接?如果没有,我想我总是可以将服务代码移动到 OnPause() 事件,但是如果应用程序失去前台焦点,这将终止连接。

还有其他方法吗?

谢谢。

4

3 回答 3

9

如果您在 Manifest 中添加“android:configChanges="orientation"” 以防止 Activity 被销毁和重新创建,您可能需要实现该方法:

public void onConfigurationChanged(Configuration newConfig)

每次更改系统配置时都会执行此方法,即当您旋转手机并更改方向时。在此方法中,您可以为您的活动重新应用新布局:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Log.e(TAG, "ORIENTATION_LANDSCAPE");
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Log.e(TAG, "ORIENTATION_PORTRAIT");
    }
}
于 2012-02-08T02:07:59.383 回答
0

要添加到@alex.veprix 的要点(并且我必须提到正确)答案,如果您正在为 API 级别 13 或更高级别的设备构建,请不要忘记按以下方式添加 ScreenSize 属性:android:configChanges="orientation|screenSize"

详情在这里:http: //developer.android.com/guide/topics/manifest/activity-element.html

于 2015-09-14T17:45:42.507 回答
0

推荐的方法是让 TaskFragment 处理您的逻辑,然后对您的活动进行一些回调以与您的 UI 同步。

更详细的解释见以下网站:http ://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

于 2015-09-14T18:32:51.690 回答