Android蓝牙通信中在Activity间传递BluetoothSocket对象

一、前言

最近在做手机端蓝牙与单片机 HC—05 模块通信的部分,需求是在一个Activity中连接蓝牙列表中的设备,连接成功后唤起另一个Activity,并在另一个Activity中实现与单片机的蓝牙模块的数据传输。实现设备的连接需要调用 mBluetoothSocket(BluetoothSocket的实例对象)的 connect 方法,实现设备的数据传输需要调用 mBluetoothSocket 的getInputStream、getOutputStream 方法来创建输入输出流,从而实现与蓝牙模块的通信。

二、分析

两个Activity都需要 mBluetoothSocket 对象,那就需要在两个Activity之间传输数据。

在Activity间的数据传输有几种方法:

  • Intent.putExtra()

  • 实现Serializabel

  • 实现parcelable

但这几种都不适合:

BluetoothSocket是被final修饰的类,这代表着无法被继承,而且并没有实现serializable和parcelable接口,同时Inten只能传输一些基本的数据类型,对于没有实现serializable和parcelable接口的对象无法进行传递,所以以上方法都不适合。

既然不能传递,那就将BluetoothSocket实例对象设置为全局变量,只要在Application的生命周期内都能调用,也就是说可以在各个Activity中使用BluetoothSocket实例。

三、解决方法

(一)创建一个全局的GlobalBlueSocket类继承Application

public class GlobalBlueSocket extends Application {
    BluetoothSocket globalBlueSocket = null;

    public void setGlobalBlueSocket(BluetoothSocket globalBlueSocket){
        this.globalBlueSocket = globalBlueSocket;
    }
    public BluetoothSocket getGlobalBlueSocket(){
        return globalBlueSocket;
    }
}

其中的 setGlobalBlueSocket 和 getGlobalBlueSocket 方法可以分别在不同的Activity中给globalBlueSocket 赋值以及获取 globalBlueSocket

(二)在AndroidManifest.xml文件中注册

<application
        android:name=".GlobalBlueSocket"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
</application>

添加 android:name=".GlobalBlueSocket" 到Application中

(三)将mBluetoothSocket传入到全局变量globalBlueSocket中

//将mBluetoothSocket装入Application全局变量,可以在其他Activity中获取到该socket
((GlobalBlueSocket) getApplication()).setGlobalBlueSocket(mBluetoothSocket);

在实现蓝牙设备连接的Activity中将连接成功获取到的 mBluetoothSocket 传入GlobalBlueSocket 的 setGlobalBlueSocket(BluetoothSocket globalBlueSocket) 方法中,这时全局对象 globalBlueSocket 就获取到 mBluetoothSocket 的实例了,下面只需在另外的Activity中获取 mBluetoothSocket 即可

(四)获取全局对象的globalBlueSocket的mBluetoothSocket实例

//获取全局对象mBluetoothSocket
mBluetoothSocket = ((GlobalBlueSocket)getApplication()).getGlobalBlueSocket();

在实现蓝牙数据传输的Activity中就可以通过全局对象globalBlueSocket获取到mBluetoothSocket的实例了。

四、总结

全局变量是装载对象的一个容器,也是Activity间对象传递的一个桥梁

(一)优点

1、生命周期长,作用范围广

它将Activity中的对象传入到Application中,作用范围包括所有的Activity都可以使用该全局对象(前提是需要先将对象赋值到全局变量),生命周期是整个应用的生命周期,从启动到销毁;

2、保证对象的唯一性

不需要担心两个Activity指向的是不同的对象,保证了不同Activity中获取到该变量的唯一性

 

(二)缺点

正是因为其生命周期长的原因,占用资源的时间长,如果全局变量较多的话,就会耗费大量的资源以及空间

因此,全局变量的数量要适度,不能太多

如有错误,欢迎指正,虚心学习!

猜你喜欢

转载自blog.csdn.net/Xiongjiayo/article/details/81880469
今日推荐