在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纪录片的一部分:
针对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")
}
}
答案 0 :(得分:0)
但没有关于如何在清单中解决这个问题的判决
那是因为它无法直接在清单中解决。
目标是获得有关连接更改的通知,并记录更改,无论应用程序是否为startet。
这是不可能的。
欢迎您:
在清单
ACTION_BOOT_COMPLETED
让您的接收者为该操作启动前台服务(即,Notification
用于用户控制的服务器)
让前台服务使用registerReceiver()
或ConnectivityManager
来了解连接更改
对于大多数开发人员而言,目标不是要了解连接更改,而是仅在有可能建立连接时才采取某些操作。为此,JobScheduler
和网络所需的工作将起作用。