2012-01-13 50 views
8

如何在新線程中啓動我的服務。我看了其他問題,但它爲我工作。在正常運行時以及在單獨的線程中運行時,需要對服務進行哪些更改?如何在新線程中啓動服務?

回答

-1

在我的項目,我有一個像這一點,它的工作:

Thread welcomeThread = new Thread() { 
@Override 
public void run() { 
    try { 
     super.run(); 
     while (isMyServiceRunning() != true) { 
      sleep(100); 
     } 
    } catch (Exception e) { 
     System.out.println("EXc=" + e); 
    } finally { 
     Intent i = new Intent(getApplicationContext(), MainPage.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(i); 
    } 
} 
}; 

welcomeThread.start(); 
+2

夥計,我問了一下啓動的服務..ü[R開始的活動.. – carora3 2012-01-13 15:07:17

+0

那麼,是什麼?將startActivity更改爲startService(i); – 2012-01-13 15:25:54

+0

對不起,這力度工作以及:(它只是當每一個似乎沒問題的時候.. – carora3 2012-01-13 15:31:39

2

http://developer.android.com/reference/android/app/Service.html

援引「需要注意的是服務,如其他應用程序對象,在其宿主進程的主線程中運行。這意味着,如果你的服務要做任何CPU密集型(如MP3播放)或阻塞(如網絡)操作,它應該產生自己的線程來完成這項工作。在進程和線程中IntentService類可以作爲Service的標準實現來使用自己的線程安排它的工作要完成。「

+0

我已經讀過:)它只是我無法弄清楚如何讓我的服務在新線程中運行。我在這個論壇上嘗試了其他問題的代碼,但是dint爲我工作。 – carora3 2012-01-13 15:13:38

+0

您是否像這樣使用IntentService? http://developer.android.com/reference/android/app/IntentService.html – Stefan 2012-01-13 15:57:31

+0

或者你可以像這樣創建一個WorkerThread: private final class WorkerThread extends Thread { \t public Handler handler; \t @覆蓋 \t public void run(){ \t Looper.prepare(); \t這個。處理機=新的處理程序(){ \t @覆蓋 \t公共無效的handleMessage(最終消息MSG){ \t開關(msg.what){ \t \t情況MSG_DO_MY_JOB: \t \t \t // ... \t \t破; \t \t case MSG_STOP: YourOuterClass.this.stopSelf(); \t \t break; \t} } }; Looper.loop(); } } 創建服務時啓動worker並在完成某些操作時將消息發送給處理程序。 – Stefan 2012-01-13 16:05:56

8

重命名public void onStart(final Intent intent, final int startId)方法_onStart並使用這個新onStart實現:

@Override 
public void onStart(final Intent intent, final int startId) { 
    Thread t = new Thread("MyService(" + startId + ")") { 
     @Override 
     public void run() { 
      _onStart(intent, startId); 
      stopSelf(); 
     } 
    }; 
    t.start(); 
} 

private void _onStart(final Intent intent, final int startId) { 
    //Your Start-Code for the service 
} 

對於API級別5及以上

public void onStart(Intent, int)在API級別5被廢棄這應該與public int onStartCommand(Intent, int)更換

@Override 
public int onStartCommand(final Intent intent, final int startId){ 
    //All code from 'onStart()' in above placed here as normal. 
} 

private void _onStart(final Intent intent, final int startId) { 
    //Your Start-Code for the service 
} 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – 2015-04-02 05:21:44

+1

@MD你是什麼意思?它顯然提供了一個答案......也許你的意思是另一個職位? – theomega 2015-04-03 21:46:39

+1

爲什麼'stopSelf();'剛開始後? – 2016-03-18 08:59:23

3

我不認爲您可以在新線程中啓動您的服務,但您可以做的是在您的服務中啓動一個新線程。

這是因爲像活動一樣,服務具有在主線程上運行的生命週期方法。

因此,您的服務將在主線程上運行,但它會在需要時創建的新線程上執行繁重的工作。

我希望它有助於..

相關問題