一、前言
最近在做手机端蓝牙与单片机 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中获取到该变量的唯一性
(二)缺点
正是因为其生命周期长的原因,占用资源的时间长,如果全局变量较多的话,就会耗费大量的资源以及空间
因此,全局变量的数量要适度,不能太多
如有错误,欢迎指正,虚心学习!