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

Dar*_*tle 6 multithreading android broadcastreceiver android-networking android-c2dm

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

// Send the registration ID to the 3rd party site that is sending the messages.
// This should be done in a separate thread.
Run Code Online (Sandbox Code Playgroud)

但是,我读过的所有内容,包括BroadcastReceiver的文档,都表明从onReceive()启动一个线程几乎肯定会引起问题,因为一旦onReceive()返回,该过程很快就会被杀死.

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

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

Dar*_*tle 3

好的,在做了更多研究后,我发现了这个问题,并且所选答案表明onReceive()在 UI 线程上运行。我没有想到这一点——因为这是一个清单声明的接收器,据我所知,没有UI线程。

由于您无法在 Android 上的 UI 线程上进行网络连接,这回答了我问题的第一部分:

  • 你们不应该也不能够从 发起网络通信onReceive()

事实上,我们位于 UI 线程上,这使得ASyncTask看起来几乎是合适的,但这与手动启动另一个线程具有相同的问题。所以看来aService是唯一的选择。