Android藍芽通訊中在Activity間傳遞BluetoothSocket物件
阿新 • • 發佈:2018-12-29
一、前言
最近在做手機端藍芽與微控制器 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中獲取到該變數的唯一性
(二)缺點
正是因為其生命週期長的原因,佔用資源的時間長,如果全域性變數較多的話,就會耗費大量的資源以及空間
因此,全域性變數的數量要適度,不能太多