gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:22:28 25 4
gpt4 key购买 nike

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

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

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

该应用程序有 3 个组件:

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

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

最佳答案

Do I even need a service?

这取决于。如果您在 BraodcastReceiver 中所做的工作不需要太多时间,那么您可以在那里完成。但是,如果您的 onReceive()运行时间太长,Android 会杀死它。一般来说,您不应该在 BroadcastReceiver 中执行网络 I/O。因此,您可以使用 BroadcastReceiver 来启动您的服务,它可以完成真正的工作。

Is my design backwards? Should the Broadcast Receiver call the service to do the work?

看我对第一个问题的回答(上)

Can you register the broadcast receiver in the manifest and not have to call it at all in code?

是的,您可以添加 <intent-filter>标记到 <receiver> list 中的标记。这将在广播适当的 Intent 时自动启动 BroadcastReceiver。您的应用程序无需运行即可发生这种情况。像这样:

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

Are multiple calls to startService() bad? I know only 1 service runs, but how do I check if the service is already running before creating it?

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

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

关于android - 正确使用后台服务/广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com