Android:如何获得关于API的连接更改的通知> 23

时间:2018-02-03 18:30:00

标签: android networking connection

在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&gt; 23不再起作用,但我找不到一个如何解决这个新API的例子!?刚才说,编程实现是通过 Context.registerReceiver(),但没有关于如何在清单中解决这个问题的句子。

这是在线Android纪录片的一部分:

https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html#MonitorChanges

  

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

目标是获得有关连接更改的通知,并记录更改,无论应用程序是否为startet。

如果有人知道如何处理,请告诉我。

更新

按照第一个回答的说明,我创建了以下结构,但它仍然无效。 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))
        }
    }

}

为MyService

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")
    }
}

1 个答案:

答案 0 :(得分:0)

  

但没有关于如何在清单中解决这个问题的判决

那是因为它无法直接在清单中解决。

  

目标是获得有关连接更改的通知,并记录更改,无论应用程序是否为startet。

这是不可能的。

欢迎您:

  • 在清单

  • 中注册ACTION_BOOT_COMPLETED
  • 让您的接收者为该操作启动前台服务(即,Notification用于用户控制的服务器)

  • 让前台服务使用registerReceiver()ConnectivityManager来了解连接更改

对于大多数开发人员而言,目标不是要了解连接更改,而是仅在有可能建立连接时才采取某些操作。为此,JobScheduler和网络所需的工作将起作用。