基于接收广播意图启动网络通信的正确方法是什么?

时间:2012-05-30 22:21:59

标签: android multithreading broadcastreceiver android-c2dm android-networking

我开始使用Google的C2DM。此过程的一部分涉及在注册发生时接收广播意图。在Google's official C2DM documentation中,示例代码在BrodcastReceiver的onReceive()方法中显示以下注释:

// Send the registration ID to the 3rd party site that is sending the messages.
// This should be done in a separate thread.

然而,我读过的所有内容,包括the documentation for BroadcastReceiver,都表明从onReceive()开始一个线程几乎肯定会引起问题,因为只要onReceive()返回,该过程很快就会被杀死

有人可能犯了一个错误,而且我应该忽略关于使用单独线程的评论,但我猜他们说这是有原因的,即使它有误导性。

有没有理由在返回之前不能或不应该使用与onReceive()相同的线程中的网络?如果这样做有问题,那么即使在C2DM之外,处理必须是常见情况的正确方法是什么?开始服务?

1 个答案:

答案 0 :(得分:3)

好的,在做了一些研究之后,我发现this questionthe selected answer表明onReceive()在UI线程上运行。我没有想过 - 因为这是一个Manifest声明的接收器,据我所知, 没有UI线程。

由于您无法在Android上的UI线程上进行联网,因此我回答了问题的第一部分:

  • 你们两个都不应该无法onReceive()发起网络通信。

我们在UI线程上使它几乎看起来像ASyncTask是合适的,但这与手动启动另一个线程有同样的问题。所以似乎Service是唯一的选择。