Как запустить службу в новой теме? - PullRequest
8 голосов
/ 13 января 2012

Как мне запустить мой сервис в новой теме. Я посмотрел на другие вопросы, но это не работает для меня. Какие изменения мне нужно внести в мой сервис при нормальной работе и при работе в отдельном потоке?

Ответы [ 4 ]

8 голосов
/ 13 января 2012

Переименуйте ваш метод 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
}
3 голосов
/ 13 января 2012

Я не думаю, что вы можете запустить свой сервис в новом потоке, но вы можете запустить новый поток в своем сервисе.

Это потому, что, как и у действия, у сервиса есть методы жизненного циклакоторые запускаются в основном потоке.

Таким образом, ваш сервис будет работать в основном потоке, но он будет выполнять тяжелую работу в новом потоке, который он создает, когда это необходимо.

Я надеюсь,это помогает ..

2 голосов
/ 13 января 2012

Ссылаясь на http://developer.android.com/reference/android/app/Service.html

"Обратите внимание, что службы, как и другие объекты приложений, запускаются в главном потоке процесса их размещения. Это означает, что если ваша служба будет выполнять какие-либо операции с интенсивным использованием ЦП (например, воспроизведение MP3) или блокировку (например, работу в сети) операции, он должен создать свой собственный поток, в котором можно выполнить эту работу. Более подробную информацию об этом можно найти в разделе Процессы и потоки. Класс IntentService доступен как стандартная реализация Service, которая имеет свой собственный поток, в котором он планирует свою работу так, чтобы она выполнялась. сделано. "

0 голосов
/ 13 января 2012

В моем проекте есть кто-то вроде этого, и это работает:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...