我为Android构建了一个应用程序,可以自动登录到特定的Guest无线网络。我希望这个应用程序即使在UI/Activity没有显示/运行的情况下也能正常工作和运行。
目前它似乎运行良好,但我对设计的后勤提出了质疑。我的问题是:
- 我甚至需要服务吗
- 我的设计倒了吗?广播接收器是否应该调用服务来完成工作
- 你能在清单中注册广播接收器,而不必在代码中调用它吗
- 对startService()的多次调用是否错误?我知道只有一个服务在运行,但在创建服务之前,我如何检查该服务是否已经在运行
该应用程序有三个组件:
- 活动-具有用于显示当前网络信息的GUI和关闭/"停止服务"按钮
- 服务-此服务只需注册一个广播接收器
-
广播接收器-这是大部分工作的内容。3.
- Activity的onCreate()调用Context.startService()
- Service onCreate()创建一个通知图标并注册广播接收器
- Broadcast Receiver onReceive()检查网络状态是否已更改,然后检查当前是否连接到特定SSID,然后调用我为注册/检查是否已验证而创建的特殊类
我甚至需要服务吗?
这取决于情况。如果你在BraodcastReceiver中所做的工作不需要太多时间,那么你可以在那里完成。然而,如果你的onReceive()
运行时间太长,那么Android会杀死它。一般来说,你不应该在BroadcastReceiver中进行网络I/O。因此,您可以使用BroadcastReceiver来启动您的服务,它可以完成真正的工作。
我的设计倒了吗?广播接收器是否应呼叫该服务做这项工作?
请参阅我对第一个问题的回答(如上)
你能在清单中注册广播接收器吗用代码调用它?
可以,您可以将<intent-filter>
标记添加到清单中的<receiver>
标记。每当适当的意愿被广播时,这将自动启动您的BroadcastReceiver。您的应用程序不需要运行就可以实现这一点。类似这样的东西:
<receiver
android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
</receiver>
对startService()的多次调用是否错误?我只知道有1个服务运行,但是在创建之前如何检查服务是否已经在运行它
多次调用startService()
即可。如果它已经启动,就不会启动另一个。对startService()
的每次调用都会在您的服务中生成对onStartCommand()
的调用。如果您想查看它是否已经在运行,可以从BroadcastReceiver使用peekService()
。如果它正在运行,这将返回一个IBinder
,但如果它还没有运行,则不会启动它。
另请参阅android.net.wii.STATE_CHANGE:在wifi断开时未触发