正确使用后台服务/广播接收器

时间:2012-07-16 16:24:21

标签: android broadcastreceiver android-service

我构建了一个Android应用程序,可以自动登录到特定的Guest无线网络。即使没有显示/运行UI / Activity,我也希望这个应用程序能够正常运行。

目前看起来效果不错,但是我对设计的后勤工作提出质疑。我的问题是:

  • 我甚至需要服务吗?
  • 我的设计倒退了吗?广播接收者是否应该拨打该服务进行工作?
  • 您可以在清单中注册广播接收器,而不必在代码中完全调用它吗?
  • 对startService()的多次调用是不是很糟糕?我知道只有一个服务运行,但在创建服务之前如何检查服务是否已经运行?

该应用程序有3个组件:

  1. 活动 - 其中包含用于显示当前网络信息的GUI和关闭/“停止服务”按钮
  2. 服务 - 所有这项服务都是注册广播接收器
  3. 广播接收器 - 这就是大部分工作。 3。

    • Activity的onCreate()调用Context.startService()
    • Service onCreate()创建一个通知图标并注册广播接收器
    • 广播接收器onReceive()检查网络状态是否已更改意图,然后检查当前是否连接到特定SSID,然后调用我注册/检查是否经过身份验证的特殊类。

1 个答案:

答案 0 :(得分:7)

  

我甚至需要服务吗?

这取决于。如果您在BraodcastReceiver中所做的工作不需要花费太多时间,那么您可以在那里完成。但是,如果您的onReceive()运行时间过长,那么Android会将其终止。通常,您不应在BroadcastReceiver中执行网络I / O.因此,您可以使用BroadcastReceiver来启动您的服务,它可以完成真正的工作。

  

我的设计倒退了吗?广播接收器是否应该呼叫该服务   做这项工作?

请参阅我对第一个问题的答案(上文)

  

您可以在清单中注册广播接收器而不是   在代码中完全调用它?

是的,您可以在清单中的<intent-filter>标记中添加<receiver>标记。每当广播适当的Intent时,这将自动启动BroadcastReceiver。您的应用程序无需运行即可实现此目的。像这样:

    <receiver
            android:name=".MyReceiver" >
        <intent-filter>
            <action android:name="android.net.wifi.STATE_CHANGE"/>
        </intent-filter>
    </receiver>
  

对startService()的多次调用是否错误?我只知道一次服务,   但是如何在创建之前检查服务是否已在运行   它?

startService()的多次调用都没问题。如果它已经启动,它将不会启动另一个。每次拨打startService()都会在您的服务中生成对onStartCommand()的呼叫。如果您想查看它是否已在运行,您可以使用BroadcastReceiver中的peekService()。如果它正在运行,它将返回IBinder,但如果它尚未运行则不会启动它。

另见android.net.wifi.STATE_CHANGE: not triggered on Wifi disconnect