2012-07-30 111 views
3

如果我打電話Android:如何獲取IntentService中調用活動的上下文?

Intent intent = new Intent(ReadingActivity.this, AdService.class); 
startService(intent);  

MyActivity類的onCreate方法中,我如何從IntentService類的onHandleIntent()方法中得到MyActivity.this訪問

@Override 
protected void onHandleIntent(Intent arg0) { 
    // TODO Auto-generated method stub 
    ((BookLib) getApplication()).createAd(I need to pass the calling activities context here); 
} 

回答

11

我怎麼從IntentService類

你不要的onHandleIntent方法內訪問MyActivity.this。

createAd()移動到活動中。如果時間有問題,請使用AsyncTask而不是IntentService

IntentService主要是爲你想要的工作去從脫鉤任何活動的情況下(例如,文件下載,如果用戶離開你的UI去做些別的事情應該繼續連)。

+0

謝謝。猜猜我需要去研究AsyncTask – jamesc 2012-07-30 19:50:34

+0

這個答案在這種情況下是一個很好的建議---錘子和指甲的故事。然而,如果你需要訪問上下文(也許是一個活動的實例),'getApplicationContext()'是[available](http://stackoverflow.com/questions/13350943/obtaining-context-for-geolocation-within-an -intentservice)。我認爲,即使從「IntentService」,也有一些情況是有道理的。例如獲取系統服務(例如'context.getSystemService(Context.ALARM_SERVICE);')。 – 2016-02-25 05:26:24

2

在我看來,像你正嘗試與您的ActivityService進行雙向通信。而不是發送Intent到您的服務,而是考慮binding

編輯:應對CommonsWare的評論:

如果是綁定到IntentService問題?我發佈的應用程序運行良好,其中包含綁定IntentService。您沒有提供證據來支持您的聲明。

here

服務可以同時起步,並沒有綁定到它的連接。在 這樣的情況下,系統將保持服務運行,只要 或者它啓動或者有一個或多個連接與 Context.BIND_AUTO_CREATE標誌。一旦這兩種情況都不成立,服務的onDestroy()方法被調用並且服務有效終止服務 。所有清理(停止線程,註銷 接收器)應從onDestroy()返回時完成。

該文檔清楚地表明,該系統支持同時結合和啓動。在常規Service上使用IntentService不會改變這一點。即使您在處理完Intent之後明確停止了該服務,Android仍然會保持運行狀態,只要仍然存在某些內容即可。

此外,根據OP試圖做什麼,IntentService可能不再需要。

+0

綁定和'IntentServices'不能很好地結合在一起。綁定到常規服務是好的,並且發送命令到'IntentServices'(通過'startService()')就沒有問題。 – CommonsWare 2012-07-30 19:12:02

+2

「綁定到IntentService的問題在哪裏?」 - 最好的情況是,只有在你調用'startService()'之前先綁定的時候它纔會起作用。否則,在綁定發生之前,你會得到'onHandleIntent()'完成的競爭條件,導致第一個IntentService實例被銷燬(通過'stopSelf()')並且綁定發生在第二個實例上。恕我直言,如果你認爲你想綁定到一個'IntentService',你真的應該綁定到一個常規的'Service'並且管理你自己的後臺線程。 – CommonsWare 2012-07-30 20:07:40

相關問題