1. 程式人生 > >Android藍芽通訊中在Activity間傳遞BluetoothSocket物件

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中獲取到該變數的唯一性

 

(二)缺點

正是因為其生命週期長的原因,佔用資源的時間長,如果全域性變數較多的話,就會耗費大量的資源以及空間

因此,全域性變數的數量要適度,不能太多

 

 

如有錯誤,歡迎指正,虛心學習!