2010-09-19 144 views
18

所以我對如何做這件事情感到非常困惑,我希望有人能夠爲我分解一點點。Android:在服務和活動之間傳遞數據

我有一個應該始終運行的服務,並且在某些時候需要提醒用戶任務要完成(可能通過通知欄圖標)。當用戶接受任務時,服務需要查看本地數據庫,構建一些非原始對象,並將它們提供給它剛剛啓動的活動。

我已經看了一遍,並得到了一個正確的方法非常困惑,所以我有幾個問題,以幫助我把我的頭圍繞它。

  1. 如果活動能的那應用接入服務和活動,同一個數據庫後創建一個本地SQLite數據庫?

  2. 服務和活動是否需要在相同或不同的包中?我想不會,但由於某種原因,我記得在其他地方看到這方面的情況。

  3. 我該如何處理從服務到活動的數據傳輸?我在想一個內容提供商,但似乎應該有一種更簡單的方式讓服務交付數據。類似於意圖,但對於非基元。

在此先感謝。

回答

12
  1. 如果Service和Activity類在同一個包中,我相信他們應該能夠訪問相同的私有存儲空間。

  2. 我會把它們放在同一個包中,因爲它們是同一個整體應用程序結構的一部分。

  3. 將數據捆綁到Intent的額外項中作爲鍵值對並啓動活動。


Intent intent = new Intent(this, SecondActivity.class); 
Bundle b = new Bundle(); 

// see Bundle.putInt, etc. 
// Bundle.putSerializable for full Objects (careful there) 
b.putXXXXX("key", ITEM); 
intent.putExtras(b); 
startActivity(intent); 

// -- later, in Activity 
Bundle b = this.getIntent().getExtras(); 
int i = b.getInt("key"); 
+6

如果兩者都不在同一個包裝中,該怎麼辦? – Nirav 2011-12-10 13:15:03

+2

@Nirav:Intent intent = new Intent(this,com.example.somepackage.SecondActivity.class); – 2014-07-07 10:24:25

5

在相同的應用程序,服務和活動可以訪問相同的SQLite數據庫。我建議使用一個SQLite數據庫。爲簡單起見,請將您的服務連接設置爲本地服務,因此您不需要AIDL接口和進程間通信。

從服務中,通知用戶,使用NotificationManager。你可以將一個可序列化的對象從你的服務傳遞給一個intent,然後傳遞給開始的activity,但我建議改爲傳遞一個db ID。

我們已經構建了一個新的Android ORM工具,您可以使用它。它包括可用於構建應用程序的原型Activity和Service類。我還沒有一個使用該服務的示例應用程序,但我將在下一個代碼中進行編碼並儘快完成。

看看...

http://ormlite.com/

而且我的博客?

http://touchlabblog.tumblr.com/

我目前正在做一些相當沉重的分貝的東西,在我工作的應用程序。服務會檢查服務器是否有更新,並基本上做你想要做的事情。它的所有非常簡單的東西。

+1

更新!我創建了一個示例應用程序,其中包含一個「執行」的服務。我還沒有把它放到svn倉庫中,但是你可以下載它並且給它旋轉。小心。沒有「關閉」按鈕的服務... http://www.kagii.com/downloads/NotifyService.tar.gz – 2010-09-20 01:42:01