Я использовал IntentService в своем коде вместо Service, потому что IntentService создает для меня поток в onHandleIntent (намерение Intent), поэтому мне не нужно сам создавать 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 службой и самому запустить поток в коде службы?
Спасибо.