2011-02-28 30 views
25

我是新來的這個機器人。我正在使用一項服務來完成一些後臺工作。所以我開始從我的活動服務如下。如何在Android的新線程啓動服務

 getApplicationContext().bindService(
     new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class), 
     serviceConnection, 
     Context.BIND_AUTO_CREATE 
    ); 

但問題是android活動被阻止。直到服務,

  onServiceConnected(ComponentName className, IBinder service){ ..} 

被稱爲back.so我搜查了這一點。我開始知道我必須以新線程開始我的服務。所以請任何人幫助我這樣做。

回答

34

要創建並啓動一個新的線程,從活動裏,你可以說:

Thread t = new Thread(){ 
public void run(){ 
getApplicationContext().bindService(
     new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class), 
     serviceConnection, 
     Context.BIND_AUTO_CREATE 
    ); 
} 
}; 
t.start(); 

此外,通過緩存返回bindservice的價值,如果有的話,如果你需要它供以後使用。

+0

感謝Samuh我將檢查了這一點... – bHaRaTh 2011-02-28 05:21:48

+1

喜Samuh其工作。現在它不會阻止我的活動,直到服務啓動..非常感謝你的幫助......我還有一個問題。我將在下一個評論.. – bHaRaTh 2011-02-28 05:30:15

+0

一旦我們綁定服務從第一次活動,我們利用該服務,我們將解除它。所以假設在我的下一個活動中,如果我們想使用相同的服務,是否我們必須再次綁定它,或者在進程中是否存在錯誤。 – bHaRaTh 2011-02-28 05:34:23

1

如果有人在閱讀本文時正在尋找一種解決方案,讓UI線程保持流暢運行,那麼最好檢查一下AsyncTask任務here。 歡呼聲。

+4

當您有代碼運行而不啓動應用程序時,AsyncTask將不會有用。 – Erol 2012-07-03 23:17:33

+0

我正在談論保持UI線程免費,我沒有看到你所說的連接...順便說一句,服務是應用程序的一部分,它們都運行在同一個進程下。也許你的意思是在活動之外運行代碼? – gor 2015-03-08 12:41:25

14

任何使用線程,Runnables,AsyncTask或其他服務的解決方案都會有常見問題

服務將阻止調用Activity直到服務啓動。因此在某些情況下無法有效地對服務進行線程化。

解決方法是使用IntentService子類。如何實現

實施例:)

public class MyCustomService extends IntentService 
{ 
    private DatabaseAdapter mAdapter; 

    public MyCustomService() { 
     super("MyCustomService"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     super.onStartCommand(intent, flags, startId); 
     Toast.makeText(this, "MyCustomService Started", Toast.LENGTH_LONG).show(); 

     // Don't let this service restart automatically if it has been stopped by the OS. 
     return START_NOT_STICKY; 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     Toast.makeText(this, "MyCustomService Handling Intent", Toast.LENGTH_LONG).show(); 
     // INSERT THE WORK TO BE DONE HERE 
    } 
} 

的onCreate(和的onDestroy也可以,只要重寫爲super.onWhatever()被稱爲在其內部。

+2

你不能用IntentService做所有的事情。服務有其自己的用法。 – Saty 2015-04-16 09:05:36

3

老問題,但我在迴應,因爲有人在另一個問題中提請我注意它。

OP的問題顯然是由服務的onBind(...)花費很長時間並阻塞主線程造成的。正確的解決方案是不要那樣做。該服務需要重新設計,以便onBind(...)快速返回。與Android API中的其他幾乎一樣,您應該始終在主線程中調用bindService(...)

原因是Java中的線程安全不僅僅是原子性的問題,而且也是visibility。 (向下滾動到可見性部分。)一般來說,除非另有明確說明,否則應始終假定每個Java API均爲而非線程安全。

1

我會推薦使用IntentService,因爲默認情況下IntentService在單獨的線程上運行。但還是如果你的服務類擴展服務,然後使用此代碼:

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     startService(new Intent(getApplicationContext(), YourService.class)); 
    } 
}; 
thread.start(); 
相關問題