2010-12-01 56 views
0

我有一個簡單的問題需要解決,但我不知道該怎麼做。Android:調用從服務到活動的方法

我有一個類擴展了運行一個線程尋找TCP連接的服務。如果有人進來,它會讀取輸入消息。

如果輸入的消息是「START」,我開始一個活動,以這種方式:

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
getApplication().startActivity(dialogIntent); 

雖然這個活動運行,服務保持運行。在某個時候,我可能會保留「停止」。我想在之前創建的Activity中調用一個方法,但我不確定如何與之交互。

我不想使用靜態方法。我怎麼能這樣做?

非常感謝你,

編輯:我改變了我的代碼如下:

Intent dialogIntent = new Intent("com.voip.rudy.START_CALL"); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress()); 
getApplication().startActivity(dialogIntent); 

而且在清單:

<activity android:name=".VoIPCall"> 
    <intent-filter> 
     <action android:name="com.voip.rudy.START_CALL" /> 
     <action android:name="com.voip.rudy.STOP_CALL" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 


<category android:name="android.intent.category.DEFAULT" /> was required to avoid having it crash. 

編輯:

解決方案給出已經解決了我的問題,但我想實際上在該類上的成員變量上行事,這些變量以前是ini tialized。說我調用構造函數,然後我想回到這個活動,並對成員變量行事。

當我調用一個接一個的動作時,成員變量不會被初始化,它似乎以某種方式創建一個新的活動。無論如何要採取相同的行動,並保持完好的物體嗎?

James

+0

你最好的選擇可能是發送廣播。 – Falmarri 2010-12-01 23:21:19

回答

2

添加Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT標記您的意圖,並通過一個新的動作或一個特殊的額外的可以識別意圖的方式調用startActivity。使用

private void handleIntent(Intent intent) { 
} 

調用這個從的onCreate(或的onResume):

活動中,編寫一個名爲方法

handleIntent(getIntent()); 

,並寫上:

@Override 
protected void onNewIntent(Intent intent) { 
    setIntent(intent); 
    handleIntent(intent); 
} 
0

有幾種方法可以做到,實際上取決於應用程序的整體結構。一切都可以工作。 1)創建一個自定義的意圖,並讓它的活動或服務在它發送時作出反應 2)代替服務,設置邏輯對於作爲對話活動內的異步任務的tcp連接,當你有tcp連接時,你可以將它傳遞給服務來完成它的工作 3)看看本地服務和遠程服務SDK示例並使用回調代碼作爲將數據傳遞迴活動的基礎。您也可以通過界面回到服務。 4)甚至可能設置一個廣播接收器'架構'。這具有將用戶活動與服務完全分離的優點。您可以將某些應用程序邏輯放入另一個進程的服務中,甚至可以在設備啓動時運行的進程中。

+0

非常感謝。非常感激。 – James 2010-12-02 07:05:36

+0

歡迎您。在SDK中有很多這些東西的例子,但是如果你需要的話,我可以拋出一個代碼片段。 – 2010-12-02 17:24:15

0

我想任何技術都可以工作。我猜你所看到的行爲與android中活動的生命週期有關,你可能需要將一些處理移動到onResume/onPause或onStart/onStop方法。如果您發現自己的活動onCreate沒有被調用,但是現在您的活動處於活動狀態,則可能僅僅是來自先前調用的活動實例在系統中仍處於活動狀態。如果是這樣,操作系統可能會使用它而不是您想要的新活動。查看這是否是問題的最好方法是在您覆蓋的所有活動方法的開頭和結尾放置一些「Log.d」調用。您將能夠通過觀看logcat來了解發生了什麼。您使用的技術也可能取決於您希望活動對TCP事件的反應的同步程度。如果你想完全異步,你可以使用標準廣播,或使用消息發送服務回調。如果你想同步,那麼用服務回調來完成。如果你還沒有看到這個SDK鏈接有一個很好的活動生命週期描述http://developer.android.com/reference/android/app/Activity.html