Я использовал IntentService в своем коде вместо Сервиса, потому что IntentService создает поток для меня в onHandleIntent (Поглощенное намерение), таким образом, я не должен создавать Thead сам в коде моего сервиса.
Я ожидал, что два намерения к тому же IntentSerivce выполнятся параллельно, потому что поток сгенерирован в IntentService для каждого, изобретают. Но мой код оказался что эти два намерения, выполняемые последовательным способом.
Это - мой код IntentService:
public class UpdateService extends IntentService {
public static final String TAG = "HelloTestIntentService";
public UpdateService() {
super("News UpdateService");
}
protected void onHandleIntent(Intent intent) {
String userAction = intent
.getStringExtra("userAction");
Log.v(TAG, "" + new Date() + ", In onHandleIntent for userAction = " + userAction + ", thread id = " + Thread.currentThread().getId());
if ("1".equals(userAction)) {
try {
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
Log.e(TAG, "error", e);
}
Log.v(TAG, "" + new Date() + ", This thread is waked up.");
}
}
}
И код звонит, сервис ниже:
public class HelloTest extends Activity {
//@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent selectIntent = new Intent(this, UpdateService.class);
selectIntent.putExtra("userAction",
"1");
this.startService(selectIntent);
selectIntent = new Intent(this, UpdateService.class);
selectIntent.putExtra("userAction",
"2");
this.startService(selectIntent);
}
}
Я видел, что этот журнал обменивался сообщениями в журнале:
V/HelloTestIntentService( 848): Wed May 05 14:59:37 PDT 2010, In onHandleIntent for userAction = 1, thread id = 8
D/dalvikvm( 609): GC freed 941 objects / 55672 bytes in 99ms
V/HelloTestIntentService( 848): Wed May 05 15:00:00 PDT 2010, This thread is waked up.
V/HelloTestIntentService( 848): Wed May 05 15:00:00 PDT 2010, In onHandleIntent for userAction = 2, thread id = 8
I/ActivityManager( 568): Stopping service: com.example.android/.UpdateService
Журнал показывает, что второе намерение ожидало первое намерение закончиться, и они находятся в том же потоке.
Это там что-либо я неправильно понял IntentService. Чтобы заставить два сервисных намерения выполниться параллельно, я должен заменить IntentService сервисом и запустить поток сам в служебном коде?
Спасибо.
Насколько мне известно, IntentService имеет один поток обработчика, и каждое намерение стоит в очереди в этом потоке. Когда все намерения в очереди выполнены, служба завершает работу. Он не создает независимых потоков для каждого намерения. Я не знаю каких-либо подклассов Service, которые работают так, как вы описываете, вам, вероятно, придется написать свой собственный.
В очереди намерений заключается весь смысл использования IntentService.
Я думаю, что вам нужна AsyncTask, а не Service или IntentService. Или вы всегда можете просто выстрелить от бедра, определив runnable, как это:
Runnable runnable = new Runnable() {
public void run() {
....
}
};
new Thread(runnable).start();
... для каждой из ваших задач. Честно говоря, это может быть проще, чем разбираться с этими вспомогательными классами Android.