【发布时间】:2018-02-03 18:29:59
【问题描述】:
在 API 23 之前,可以在 Manifest 中注册广播接收器,该接收器将在连接更改时触发。
<manifest>
...
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
...
<receiver
android:name=".NetworkStateChangeReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
</manifest>
来自 API > 23 不再起作用,但我找不到有关如何为较新的 API 解决此问题的示例!?刚才说了,程序化的实现是通过Context.registerReceiver(),但是manifest中没有说明如何解决这个问题。
这是在线 Android 文档的一部分:
面向 Android 7.0(API 级别 24)及更高版本的应用如果在清单中声明广播接收器,则不会接收 CONNECTIVITY_ACTION 广播。如果应用向 Context.registerReceiver() 注册 BroadcastReceiver 并且该上下文仍然有效,则应用仍将收到 CONNECTIVITY_ACTION 广播。
目标是获得有关连接更改的通知并记录更改,无论应用是否启动。
如果有人知道如何处理,请告诉我。
更新
按照第一个答案的说明,我创建了以下结构,但它仍然无法正常工作。 永远不会触发 BOOT_COMPLETED 接收器!?
清单:
<manifest>
...
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver android:name=".StartUpBootReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<!--For HTC devices-->
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<service
android:name=".MyService"
android:exported="false"/>
<receiver
android:name=".NetworkStateChangeReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
</manifest>
****StartUpBootReceiver****
class StartUpBootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
context.startService(Intent(context, MyService::class.java))
}
}
}
我的服务
class MyService : Service() {
val receiver = NetworkStateChangeReceiver()
override fun onBind(p0: Intent?): IBinder? {
return null
}
override fun onCreate() {
super.onCreate()
registerReceiver(
receiver,
IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION))
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(receiver)
}
}
NetworkStateChecngeReceiver
class NetworkStateChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d(javaClass.simpleName, "### NetworkChange received")
}
}
【问题讨论】:
标签: android networking connection