用于启用移动连接的广播接收器不起作用

时间:2016-11-27 18:16:02

标签: android android-studio broadcastreceiver

我正在尝试编写BroadcastReceiver来检查Internet连接。但它不起作用。我的接收者是:

public class MobileDataOnBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(MainActivity.TAG, "Broadcast received");
        Intent intent1 = new Intent(context, LoadPictureService.class);
        context.startService(intent1);
    }
}

当我尝试在MainActivity中动态注册时,我得到" Cannot resolve symbol conn":

当我尝试在Manifest中注册时,BroadcastReceiver根本就没有开始。我的Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.aleksandr.homework3">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".MobileDataOnBroadcastReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

关于此主题的Stack Overflow上有很多问题,但没有人回答我的问题。为什么我无法动态注册BroadcastReceiver?在Manifest时,为什么它不起作用?我该怎么做才能让它发挥作用?

1 个答案:

答案 0 :(得分:3)

您需要使用this API动态注册接收器,请注意第二个参数是IntentFilter。 您可以尝试以下代码

IntentFilter filter = new IntentFilter();
filter.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION);   
// this is the constant value android.net.conn.CONNECTIVITY_CHANGE
registerReceiver(receiver, filter);

另请注意,如果您的目标是API 24或更高版本,那么您将无法获得通过清单条目注册的此广播。

请参阅this

  

定位到Android 7.0的应用不会收到CONNECTIVITY_ACTION广播,即使他们有明确的条目来请求通知这些事件。正在运行的应用程序仍然可以在主线程上侦听CONNECTIVITY_CHANGE,如果它们请求使用BroadcastReceiver进行通知。

通常,动态注册的接收器是进行此类广播的方式。只需记住在组件生命周期状态发生变化或不再需要广播时对它们进行适当的重新签名。