连接状态变化广播 Android O

4
我们拥有一个基于WiFi的应用程序,拥有数百万客户。该应用程序的核心逻辑是在连接时将用户连接到公共开放的热点,并具有自动登录功能。该应用程序完全依赖这些广播。
<intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>

广播后,应用程序将检查连接的Wi-Fi热点并尝试自动登录。

在Android O中,应用程序不会接收上述任何广播。通过使用广播接收器解决方案查看后台服务,似乎Android会在某些时候停止服务。

非常感谢您的任何建议。


1
使用前台服务和registerReceiver() - CommonsWare
@CommonsWare 感谢您的建议。这可能会影响用户体验,因为前台服务仍然在通知窗口中。 - Isham
2
据我所知,对于您想要的功能,您几乎没有选择。 - CommonsWare
3个回答

4

使用 JobSchedulerJobIntentServiceFirebase Job Dispatcher 用于向后兼容)。请参考来自 Android Developers 的最新视频

使用方法 JobInfo.Builder.setRequiredNetworkType(),您可以在特定网络条件满足时安排作业运行。

引用自 此线程

网络类型可以是以下三个值之一:

  • JobInfo.NETWORK_TYPE_NONE:不需要网络连接。

  • JobInfo.NETWORK_TYPE_UNMETERED:一个未计量的 WiFi 或以太网连接。

  • JobInfo.NETWORK_TYPE_ANY:任何网络连接(WiFi 或蜂窝数据)。

JobInfo.NETWORK_TYPE_UNMETERED 适合您的需求。


我会尝试并更新您。感谢建议。 - Isham
@Isham 你好。工作了吗?我在安卓9 AOSP上使用Badoo约会应用程序,当我打开WiFi连接七到八个小时后唤醒时,它会发送给我通知。 - NimaAzhd

2
在运行时注册broadcastReceiver,而不是在清单文件中注册。
如果您需要在始终运行的服务中执行此操作,请在前台服务中执行此操作。
阅读这里这里获取更多信息,因为针对Android 7.0及以上版本的应用程序将无法通过清单文件再次获得此意图:
应用程序针对Android 7.0(API级别24)及更高版本,如果在其清单文件中声明广播接收器,则不会接收此广播。如果使用Context.registerReceiver()注册BroadcastReceiver并且该上下文仍然有效,则应用程序仍将接收广播。
我已经制作了一个简单的方法来在运行时注册,这里

1

摘自文档:

针对Android 7.0(API级别24)及更高版本的应用程序,如果在其清单文件中声明广播接收器,则不会接收到CONNECTIVITY_ACTION广播。如果使用Context.registerReceiver()注册BroadcastReceiver并且该上下文仍然有效,则应用程序仍将接收到CONNECTIVITY_ACTION广播。 监视连接更改


如The Docs和CommonsWare(在评论中)所提到的,使用前台服务并在其中注册您的接收器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接