2011-10-15 65 views
4

我有一個應用程序在第一次啓動時啓動服務。 之後,它定期從服務器提取數據。Android定期將數據從服務發送到活動

  1. 我已經打開我的活動,如果有刷新按鈕,我已經有服務,這是已經在那一刻,我想禁用按鈕,一旦新數據被加載我有後臺獲取數據在活動中顯示它並啓用刷新按鈕。

  2. 如果活動未運行,則應顯示通知。

所以第二點是最簡單的和完成的。我被困在重點1.如何定期向服務中的活動發送數據?我正在使用數據庫來存儲數據。

對此有何幫助?

回答

10
  • 你可以有你的服務發送「郵件」到你的活動Messenger,使其作爲服務檢測到新的內容(參見活動/服務信使this android developers help section)儘快作出反應。

以下是雙向消息傳送示例(從服務到活動和從活動到服務)。引述商務部:

你可以看到如何提供在 MessengerService.java(服務)的雙向通訊和 MessengerServiceActivities.java(客戶端)的樣品的例子。

以下是相關部分。

傳入的處理程序中的活動:

/** 
    * Activity Handler of incoming messages from service. 
    */ 
    class IncomingHandler extends Handler { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
       case MessengerService.MSG_SET_VALUE: 
        mCallbackText.setText("Received from service: " + msg.arg1); 
        break; 
       default: 
        super.handleMessage(msg); 
      } 
     } 
    } 

    /** 
    * Activity target published for clients to send messages to IncomingHandler. 
    */ 
    final Messenger mMessenger = new Messenger(new IncomingHandler()); 

在服務上,只顯示相關部分:

/** 
* Handler of incoming messages from clients. 
*/ 
class IncomingHandler extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     //obtain Activity address from Message 
     Messenger mClient=msg.replyTo; 
     try { 
     // try to send it some mValue 
      mClient.send(Message.obtain(null,MSG_SET_VALUE, mValue, 0)); 
     } catch (RemoteException e) { 
      // The client is dead. Remove it 
      mClient=null; 
     } 
    } 
} 

/** 
* Target we publish for clients to send messages to IncomingHandler. 
*/ 
final Messenger mMessenger = new Messenger(new IncomingHandler()); 
  • 你也可以bind爲您服務您的活動,並定期調用一個你的服務方法來檢查新的內容。爲此,如果您的服務是另一個應用程序,您必須使用使用aidl(這很難)。如果它在同一個包中,我建議你使用更簡單的'local service binding'
+0

我的應用程序服務在同一個包中。即使使用Messenger,我也可以將消息從活動發送到服務。我需要從服務到活動的一些東西。可能不是定期調用某種方法。 –

+0

@UmakantPatil我將活動<=>的鏈接附加到服務雙向通訊示例源。你會發現如何在那裏實現服務 - >活動消息傳遞。快樂編碼! –

+0

@UmakantPatil在答案中直接添加樣本的相關部分 –

相關問題