连接检查不工作在Android奥利Kotlin

试图在网络上调用称为NetworkReceiver的广播接收机。 在java中的相同的代码工作,但在Kotlin中试图做它不工作。 当连接发生或丢失时,接收器从不被调用。 我试图在模拟器中做到这一点。 另外接收器在引导完成时不被调用。 此外我进行测试这在Android奥利奥,即Android 8.0

NetworkReceiver.kt 
 class NetworkReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Logs.v("onReceive") val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo if (networkInfo != null && networkInfo.detailedState == NetworkInfo.DetailedState.CONNECTED) { Logs.v("Network Connected") } else if (networkInfo != null) { val state = networkInfo.detailedState Logs.v("NetworkReceiver", state.name) } else { Logs.v("Network Connected") } } } 

的Manifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.android.client"> <!-- To auto-complete the email text field in the login form with the user's emails --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:name=".application.App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <receiver android:name=".network.NetworkReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> </intent-filter> </receiver> <activity android:name=".views.activities.kt.LoginActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".views.activities.kt.DashboardActivity" android:label="@string/title_activity_dashboard" android:theme="@style/AppTheme.NoActionBar" /> <activity android:name=".views.activities.kt.ConfigurationActivity" android:label="@string/title_activity_configuration" android:theme="@style/AppTheme.NoActionBar"/> </application> </manifest> 

你需要这个权限来监听启动完成:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

尝试通过以下方式在清单中声明您的广播接收器:

 <receiver android:name=".network.NetworkReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> </intent-filter> </receiver> 

在奥利奥,广播接收机的行为已经改变,受到更多的限制。 我很惊讶,你说“它在Java中工作”。

无论如何,你需要阅读 “奥利奥”的变化。 而你的应用程序中缺少一些东西。 您需要在接收器的清单中设置android:enabled="true" ,您需要调用…

 registerReceiver(MyNetworkReceiver(), IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))` 

…从您的应用程序(可能在onCreate)接收连接状态更改,而您的应用程序正在运行(它也将在应用程序启动时触发)。 您也可能需要在清单中设置android:export="true" (用于从白名单操作接收广播)。