亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何讓Android服務與活動進行通信

如何讓Android服務與活動進行通信

如何讓Android服務與活動進行通信我正在編寫我的第一個Android應用程序,并試圖在服務和活動之間進行溝通。我有一個服務,將運行在后臺,并做一些GPS和基于時間的日志記錄。我將有一個活動,將用于啟動和停止服務。因此,首先,我需要能夠確定服務在活動啟動時是否正在運行。這里還有一些其他的問題,所以我想我可以弄清楚(但請隨時提供建議)。我真正的問題是:如果活動正在運行,并且服務已經啟動,我需要一種讓服務向活動發送消息的方法。這一點上的簡單字符串和整數-狀態消息主要是。消息不會定期發生,所以我不認為輪詢服務是一個很好的方式,如果有其他方式。我只希望在用戶啟動該活動時進行此通信-我不希望從服務中啟動該活動。換句話說,如果您啟動了該活動,并且服務正在運行,那么當發生一些有趣的事情時,您將在ActivityUI中看到一些狀態消息。如果您不啟動該活動,您將不會看到這些消息(它們沒有那么有趣)。似乎我應該能夠確定服務是否正在運行,如果是的話,將活動添加為偵聽器。然后,在活動暫?;蛲V箷r,以偵聽器的身份刪除該活動。這真的有可能嗎?我能找到的唯一方法是讓活動實現Parcelable并構建一個AIDL文件,這樣我就可以通過服務的遠程接口傳遞它。不過,這似乎有點過火了,我不知道該活動應該如何實現writeToPackcel()/readFromPackcel()。有沒有更簡單或更好的方法?謝謝你的幫助。編輯:對于以后對此感興趣的人,有來自Google的示例代碼,用于通過示例目錄/apis/app/RemoteService.java中的AIDL處理這個問題。
查看完整描述

3 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

有三種明顯的與服務通信的方式:

  1. 使用意圖
  2. 使用AIDL
  3. 使用服務對象本身(作為單例)

在您的例子中,我選擇了選項3。對它自己的服務進行靜態引用,并在onCreate()中填充它:

void onCreate(Intent i) {
  sInstance = this;}

使一個靜態函數MyService getInstance(),它返回靜態sInstance.

然后進去Activity.onCreate()您可以異步地啟動服務,直到服務實際啟動(您可以讓您的服務通過向活動發送意圖通知您的應用程序它已經準備好了)。得到它的例子。當您擁有實例時,將您的服務偵聽器對象注冊到您的服務中,您將被設置。注意:當編輯活動中的視圖時,應該在UI線程中修改視圖,服務可能會運行自己的線程,因此需要調用Activity.runOnUiThread().

最不需要做的事情是移除對偵聽器對象的引用。Activity.onPause(),否則活動上下文的實例就會泄漏,而不是很好。

注意:只有當應用程序/活動/任務是訪問服務的唯一進程時,此方法才會有用。如果不是這種情況,您必須使用選項1或2。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 913 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號