0

我有一個應用程序,我需要與另一部手機建立和維護藍牙連接。但是,即使屏幕關閉,此連接仍需保持活動狀態。Android服務 - 調用方法和傳遞對象,無需綁定

所以我這樣做的方式是1)使它成爲一個服務,以便連接可以存在於後臺2)明確調用啓動/停止服務而不是綁定到活動(我相信如果屏幕熄滅,活動將消失,因此服務將停止)因此,我的服務具有需要手動調用的方法,這使事情變得更加複雜。例如,我想在用戶單擊按鈕時開始發現藍牙。所以在點擊按鈕時,我需要告訴該服務調用我的startDiscovery方法。有很多這樣的情況(例如打開套接字,配對到設備等),我需要手動調用服務方法

我讀過的這個主題很多都是通過綁定服務來解決這個問題,但是這個我不能這樣做,如前所述

沒有綁定,其他人建議使用某種事件總線,在按鈕點擊我發送消息到服務。當它收到消息時,它會檢查它是什麼類型的消息,然後調用適當的方法。

好的,這是有效的,但如果我的方法需要我傳遞某些信息會怎樣?例如,可以說我有一個列表或我需要通過藍牙發送的內容。所以我在我的Service中有一個方法,它接受一個列表對象,將它序列化並通過BT將它發送到另一個電話。但是,對於基本的消息傳遞/事件總線系統來說,這似乎不可行

總而言之,如何將對象傳遞給未綁定到活動的服務中的方法,而是通過手動方式啓動startService

我看到這個問題here,但是這種方法似乎只允許我在啓動服務時發送對象。在我的情況下,該服務已經開始,並在後臺處理藍牙流量。我需要能夠在服務已經運行時調用方法並傳遞對象

回答

0

我在服務中做了類似的事情。有時我需要手動隱藏服務創建的通知。所以,我提出的方法公開和靜態的,所以它可以在任何地方像這樣調用:

public static void hideNotification(){ 
    notificationManager.cancel(0); 
} 

然後把它在你的活動是這樣的:MyService.hideNotification()

編輯

如果你不想一個靜態方法,您可以爲您的服務創建一個空的構造函數,然後當您需要調用該方法時,創建一個新的服務實例並從中調用它。例如:

在服務:

public class MyService extends Service{ 
    public MyService(){} 

    public void hideNotification(){ 
     notificationManager.cancel(0); 
    } 
} 

當你需要調用一個方法:

MyService service = new Myservice(); 
service.hideNotification(); 
+0

是的,我已經試過讓我所有的方法靜態的,但它似乎會帶來一些問題與藍牙連接。我不確定這是否是由於我的實施,但我希望避免使用靜態方法 – Simon

+0

@Simon請參閱更新的答案 – TychoTheTaco

相關問題