WiFi更改时未调用BroadcastReceiver

时间:2018-12-16 23:29:16

标签: android android-broadcastreceiver

我已经根据https://developer.android.com/guide/components/broadcasts实现了BroadcastReceiver,但是它似乎不起作用。

Manifest.xml的接收器部分如下所示(我使用android.permission.ACCESS_NETWORK_STATE和android.permission.ACCESS_WIFI_STATE):

...
<receiver android:name=".BackgroundTask">
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>
</receiver>
...

并且已在我的应用程序中声明。

我的BroadcastReceiver类如下:

public class BackgroundTask extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("Connection changed!");
        Toast.makeText(context, "Network state changed", Toast.LENGTH_LONG).show();
    }
}

既不显示烤面包,也不在logcat上收到println-ed输出。 我还阅读了建议我使用排定作业而不是接收者的注释,但是找不到如何使用它来侦听网络更改的示例。

我要使用此功能的原因是因为我希望我的(后台)应用程序仅在手机连接到WiFi时才能运行-如果您对实现此方法有任何不同的建议,我也非常感谢

顺便说一句。我正在使用Android 8.0.0。

干杯, 尼古拉(Nikolar)

更新

以某种方式仍然无法正常工作。我忘了什么吗?

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mypackagename">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        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">
        <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=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.ACTION_BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
        <receiver android:name=".BackgroundPoller">
        </receiver>
    </application>
</manifest>

为清楚起见,我将BackgroundTask-Class重命名为BootReceiver:

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("INFO", "BootReceiver started");
        Intent newIntent = new Intent(context, BackgroundPoller.class);
        context.sendBroadcast(newIntent);
        Log.d("INFO", "BackgroundPoller activated");
    }
}

当我成功发送广播后

adb.exe shell am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED

我仍然没有日志输出。

1 个答案:

答案 0 :(得分:0)

要绕开Oreo的广播接收器限制,必须使用Context.registerReceiver()注册接收器。您可以通过将Application子类化并在onCreate()中注册接收者来实现。唯一的缺点是必须启动您的应用程序才能调用Application.onCreate()。要解决此问题,您可以在清单中注册ACTION_BOOT_COMPLETED接收者,因为此操作不受限制。您的ACTION_BOOT_COMPLETED接收器不需要执行任何操作,但是它将强制您的应用在引导时开始运行,因此将调用Application.onCreate()。然后,唯一的挑战就是保持您的应用程序运行,因为如果用户不进入应用程序,系统将杀死它。有两种解决方案。您可以编写一个前台服务,其唯一目的是使应用程序保持活动状态。或使用AlarmManager计划一些意图,以唤醒您的应用程序,这将再次注册您的接收者。