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