5

我为 Android 构建了一个应用程序来自动登录到特定的访客无线网络。我希望这个应用程序即使在 UI/Activity 没有显示/运行时也能工作和运行。

目前它似乎运作良好,但我质疑设计的后勤工作。我的问题是:

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

该应用程序有 3 个组件:

  1. Activity - 有一个用于显示当前网络信息和关闭/“停止服务”按钮的 GUI
  2. 服务- 这个服务所做的只是注册一个广播接收器
  3. 广播接收器- 这是大部分工作。3.

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

1 回答 1

8

我什至需要服务吗?

这取决于。如果您在 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() 不好?我知道只有 1 个服务在运行,但是如何在创建服务之前检查该服务是否已经在运行?

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

另请参阅android.net.wifi.STATE_CHANGE: not trigger on Wifi disconnect

于 2012-07-20T08:38:15.410 回答