如何通过配置更改在Android上管理蓝牙连接?

fir*_*ice 7 java sockets multithreading android bluetooth

问题:
如何管理(连接,读取,写入,断开)通过配置更改而持续存在的蓝牙连接?

首选使用ActionBarSherlock与设备版本2.2"Froyo"兼容的解决方案.

问题...

  • BluetoothDevice不能BluetoothSocket也不能保留onSaveState.

  • 为了保持我的应用程序响应,12秒阻止调用BluetoothSocket.connect()必须在单独的线程上进行.启动a Runnable是线程长任务的推荐方法,但是尝试恢复配置更改是一场噩梦.官方文档指出了三种不同的解决方案.

更新1

  • 进一步的研究使我得到了asyncTaskLoader,但似乎这只能在完成时更新UI,并且无法提供更新.

  • BluetoothHDP示例使用服务.服务似乎侧重于进程间通信以及持续超出活动生命周期的需要.我不需要这些功能.

更新2

正如鲁本所指出的,Fragment.setRetainInstance(bool)已经取代了被弃用的getLastNonConfigurationInstance().在这一点上,似乎最好的选择是使用持久的非UI片段setRetainInstance(true).

Axa*_*dax 8

我会通过使用一个Service可以处理你的蓝牙连接的问题来解决这个问题,并按照本答案中的描述使该服务回复你的Activity .

然后,您可以使用ASyncTask简单地显示/隐藏对话框,并在轮换时取消/重新启动ASyncTasks,这可以通过Shelves Example您提到的方式完成.

服务并不是那么可怕,可能是解决问题的最佳工具.

  • 我不同意.我希望我的应用程序处理后台备份到服务器 - 一个简单的20行IntentService是我能找到的最简单的解决方案. (4认同)

Reu*_*ton 1

对此有很多解决方案。如果您不使用 Fragments,那么最简单的选择是重写 onRetainNonConfigurationInstance()。不要介意该 API 已被弃用,那只是因为他们希望您使用 Fragment(公平地说,Fragment.setRetainInstance() 使整个问题变得理所当然)。这个 API 在很长一段时间内不会消失。

我要做的就是重写 onRetainNonConfiguration() 以返回“this”,即对死 Activity 实例的引用,然后从 onCreate() 复制所需的对象引用,即:

Object obj = getLastNonConfigurationInstance();
if (obj != null) {
    MyActivity deadActivity = (MyActivity)obj;
    this.foo = deadActivity.foo;
    this.bar = deadActivity.bar;
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用服务,但我个人不喜欢它们。毫无疑问,对于执行跨进程的操作很有用,但除此之外,它们也是寻找问题的解决方案。

最后,作为一般顺序,您可以安全地将“全局”数据填充到您的应用程序上下文中。为此,您需要对 android.app.Application 进行子类化,并在清单中使用 <application android:name="MyApp"> 属性。在全局静态数据中保留对 Application 对象的引用也很有用,因此 AsyncTasks 和其他无上下文代码始终可以访问应用程序上下文,而不必无缘无故地传递 Context 参数。

class MyApp extends Application {
...

    public static MyApp context;
    ...

    @Override
    public void onCreate() {
        super.onCreate();

        context = this;

        ... set up global data here ...
    }
...
}
Run Code Online (Sandbox Code Playgroud)