2012-01-13 22 views

risposta

-1

Nel mio progetto, ho qualcuno come questo ed è il lavoro:

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

Amico, ho chiesto di iniziare un servizio di .. U R iniziare un'attività .. – carora3

+0

sì, quali? cambia startActivity in startService (i); –

+0

dispiace che il lavoro a forza così :(Il suo solo intercettazioni quando ogni sembra bene .. – carora3

2

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

"Si noti che i servizi, come gli altri oggetti di applicazione, eseguire nel thread principale del loro processo di hosting Ciò significa che, se il tuo servizio sta per fare operazioni a livello di CPU (come la riproduzione di MP3) o di blocco (come il networking), dovrebbe generare il proprio thread in cui farlo funzionare.Ulteriori informazioni su questo possono essere trovate in Processi e Thread. La classe IntentService è disponibile come implementazione standard del Servizio che ha il suo proprio thread dove pianifica il suo lavoro da fare. "

+0

ho già letto che :) il suo solo che Non sono in grado di capire come far funzionare il mio servizio in una nuova discussione. Ho provato con il codice da altre domande in questo forum, ma il lavoro a forza per me. – carora3

+0

Hai usato IntentService come qui? http://developer.android.com/reference/android/app/IntentService.html – Stefan

+0

In alternativa è possibile creare un WorkerThread come questo: private final class WorkerThread estende Thread { \t handler gestore pubblico; \t @ Override \t public void run() { \t Looper.prepare(); \t questo.handler = new Handler() { \t @Override \t pubblico handleMessage void (msg Messaggio finale) { \t interruttore (msg.what) { \t \t caso MSG_DO_MY_JOB: \t \t // \t ... \t \t pausa ; \t \t case MSG_STOP: YourOuterClass.this.stopSelf(); \t \t interruzione; \t} } }; Looper.loop(); } } Avviare il worker quando viene creato il servizio e inviare messaggi al gestore quando si desidera eseguire qualcosa. – Stefan

8

Rinominare il metodo public void onStart(final Intent intent, final int startId)-_onStart e utilizzare questa nuova implementazione 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 
} 

Per i Livelli API 5 e superiori

public void onStart(Intent, int) è stata sconsigliata a livello di API 5. Questo dovrebbe essere sostituito con 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

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. –

+1

@ MD Cosa intendi? Fornisce chiaramente una risposta ... Forse intendevi un altro post? – theomega

+1

Perché 'stopSelf();' subito dopo l'avvio? –

3

Non penso che tu possa iniziare il tuo servizio in una nuova discussione, ma quello che puoi fare è iniziare una nuova discussione nel tuo servizio.

Questo perché, come l'attività, il servizio ha metodi del ciclo di vita eseguiti sul thread principale.

Così il vostro servizio verrà eseguito sul thread principale ma farà il pesante sollevamento di un nuovo thread che crea quando è necessario.

Spero che aiuta ..

Problemi correlati