IntentService的意外行为

时间:2010-05-05 22:14:29

标签: android

我在代码中使用了IntentService而不是Service,因为IntentService在onHandleIntent(Intent 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并在服务代码中自己启动一个线程?

感谢。

5 个答案:

答案 0 :(得分:9)

意图排队是使用IntentService的重点。

答案 1 :(得分:7)

对IntentService的所有请求都在一个工作线程上处理,一次只处理一个请求。如果你想并行完成两个任务,我认为你需要在Service启动后使用Service并为每个任务创建线程。

对于AsyncTask,有一个用于处理所有任务的线程池。如果您的任务编号超过了线程池大小,则其中一些AsyncTasks需要等到池中的线程可用。但是,线程池大小在不同平台版本中更改。

这是我的测试结果:

  • Android 2.2:线程池大小= 5
  • Android 1.5:线程池大小= 1

答案 2 :(得分:6)

据我所知,IntentService有一个处理程序线程,每个intent在该线程中排队。完成所有排队的意图后,服务退出。它不会为每个意图创建独立的线程。我不知道任何以您描述的方式工作的Service子类,您可能必须自己编写。

答案 3 :(得分:1)

我认为你想要的是AsyncTask而不是Service或IntentService。或者你总是可以通过定义这样的可运行来从臀部射击:

Runnable runnable = new Runnable() {

    public void run() {
        ....
    }
};
new Thread(runnable).start();

...为您的每项任务。老实说,这可能比处理这些Android助手类更容易。

答案 4 :(得分:0)

以下是使用Service而不是IntentService的示例,它可能会满足您的需求。 http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService