2012-08-25 40 views
0

我做了很多研究,但我沒有通過它,所以我不知道如何實現我的應用程序。該應用程序包含2+內容的活動,應由後臺的服務更新。所以我不知道如何做連接,有人說我應該做ipc,但是其他人會說這太多工作,只要服務和活動在同一個過程中運行。我擔心可以輕鬆創建像ActivityOne.RefreshData(Data data)這樣的方法並調用服務中的那些方法,但是直到現在我還沒有設法實現它。我希望你對我有一些建議,並對我的壞英語感到抱歉!我的Android應用程序有哪些結構?

歡呼

回答

1

如果您只需要提供數據/更新到自己的活動,那麼肯定是不需要的IPC。

爲了達到這個目的,我會顛倒你似乎正在描述的方向,而不是讓活動上的服務調用方法,讓它將消息推送給Activity提供給它的Handler。

參見: http://developer.android.com/reference/android/os/Handler.html

http://mobileorchard.com/android-app-developmentthreading-part-1-handlers/

請注意,如果您需要從業務發送給activites什麼始終是同一類型的對象,你可以使用簡化的handleMessage()的實現Message.obj字段來保存你的類型,而不打擾Bundles或Parcelling。如:

處理器IMPL在活動,其中NotificationModel是服務始終發送類型:

private Handler mNotificationListener = new Handler(){ 
    @Override 
     public void handleMessage(Message msg) { 
     handleIncomingNotification((NotificationModel)msg.obj); 
     } 
    }; 

張貼封郵件給這個處理程序的服務端是這樣的:

public class NotificationRouter { 

    private Application mContext; 
    private SparseArray<Handler> mListeners = new SparseArray<Handler>(); 

    public NotificationRouter (Application app){ 
    this.mContext = app; 
    } 

    public void registerListener(Handler handler){ 
    mListeners.put(handler.hashCode(), handler); 
    } 

    public void unRegisterListener(Handler handler){ 
    mListeners.remove(handler.hashCode()); 
    } 

    public void post(NotificationModel notice){ 
    Message m = new Message(); 
    m.obj = notice; 
    for (int i = 0; i < mListeners.size(); i++){ 
     Handler h = mListeners.valueAt(i); 
     h.sendMessage(m); 
    } 
    } 
} 
+0

非常感謝,爲了您的答案,我將加入鏈接並希望獲得一些成功 – user1624722

+0

我是否必須將處理程序從啓動服務的活動傳遞給通過Intent通過startService傳遞的服務? – user1624722

+0

不,當你的Activity啓動服務時,它應該綁定到它,因此有一個引用來調用它的方法。所以在綁定/啓動服務之後,你的活動應該能夠從上面的例子中調用service.registerListener。 – mmeyer