我构建了一个Android应用程序,可以自动登录到特定的Guest无线网络。即使没有显示/运行UI / Activity,我也希望这个应用程序能够正常运行。
目前看起来效果不错,但是我对设计的后勤工作提出质疑。我的问题是:
该应用程序有3个组件:
广播接收器 - 这就是大部分工作。 3。
答案 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