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



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

目前它似乎运行良好,但我对设计的后勤提出了质疑。我的问题是:

  • 我甚至需要服务吗
  • 我的设计倒了吗?广播接收器是否应该调用服务来完成工作
  • 你能在清单中注册广播接收器,而不必在代码中调用它吗
  • 对startService()的多次调用是否错误?我知道只有一个服务在运行,但在创建服务之前,我如何检查该服务是否已经在运行

该应用程序有三个组件:

  1. 活动-具有用于显示当前网络信息的GUI和关闭/"停止服务"按钮
  2. 服务-此服务只需注册一个广播接收器
  3. 广播接收器-这是大部分工作的内容。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断开时未触发

最新更新