2012-01-13 12 views

Odpowiedz

-1

W moim projekcie, mam kogoś takiego i to jest praca:

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

Dude, poprosiłem o rozpoczęciu usługę .. U R rozpoczęcie działalności .. – carora3

+0

tak, to jakie? zmień wartość startActivity na startService (i); –

+0

Przepraszam, że ta aplikacja działa również :(To tylko podsłuch, kiedy wszystko wydaje się w porządku .. – carora3

2

Powołując od http://developer.android.com/reference/android/app/Service.html

„Należy pamiętać, że usługi, podobnie jak inne obiekty aplikacji, uruchamianych w głównym wątku procesu ich hosting Oznacza to, że jeśli twoja usługa będzie wykonywała intensywnie procesor (taki jak odtwarzanie MP3) lub blokowanie (takie jak praca w sieci), powinien odrodzić własny wątek, w którym można wykonać tę pracę. Więcej informacji na ten temat można znaleźć w procesach i wątkach Klasa IntentService jest dostępna jako standardowa implementacja Usługi, która ma swoją własny wątek, w którym planuje swoją pracę do wykonania. "

+0

Już to przeczytałem :) To właśnie to Nie jestem w stanie dowiedzieć się, jak uruchomić moją usługę w nowym wątku. Próbowałem kodu z innych pytań na tym forum, ale pracuję dla mnie. – carora3

+0

Czy używałeś IntentService, jak tutaj? http://developer.android.com/reference/android/app/IntentService.html – Stefan

+0

Alternatywnie możesz utworzyć WorkerThread w ten sposób: prywatna ostatnia klasa WorkerThread rozszerza wątek { \t public Handler handler; \t @ Zastąpienie \t publiczny void run() { \t Looper.prepare(); \t to.Handler handler = new() { \t @Override \t public void handleMessage (końcowe msg Message) { \t przełącznik (msg.what) { \t \t przypadek MSG_DO_MY_JOB: \t \t \t // ... \t \t przerwa ; \t \t obudowa MSG_STOP: YourOuterClass.this.stopSelf(); \t \t Przerwa; \t} } }; Looper.loop(); } } } Uruchom pracownika po utworzeniu usługi i wyślij wiadomości do obsługi, jeśli chcesz coś zrobić. – Stefan

8

Zmień nazwę metody public void onStart(final Intent intent, final int startId) do _onStart i wykorzystać tę nową onStart realizacji:

@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 
} 

dla poziomów API 5 i nowsze

public void onStart(Intent, int) została zaniechana na poziomie API 5. To powinno być zastąpione 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

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, pozostaw komentarz pod swoim postem. –

+1

@MD co masz na myśli? Jasno daje odpowiedź ... Może miałeś na myśli inny post? – theomega

+1

Dlaczego 'stopSelf();' zaraz po uruchomieniu? –

3

Nie sądzę, że możesz uruchomić usługę w nowym wątku, ale możesz zacząć od nowego wątku w swojej usłudze.

Dzieje się tak, ponieważ podobnie jak działanie, usługa ma metody cyklu życia, które działają w głównym wątku.

Twoja usługa będzie działała na głównym wątku, ale spowoduje ciężkie podnoszenie nowego wątku, który tworzy, kiedy tylko będzie trzeba.

Mam nadzieję, że to pomaga ..

Powiązane problemy