小编Ema*_*nte的帖子

广播接收器在 Android 8 的前台服务中不起作用

我正在尝试创建一个应用程序,允许用户在设置的时间间隔内或手动使设备静音。我还希望用户能够输入更复杂的规则,例如仅在连接到某个 WiFi 网络、蓝牙设备或进入地理围栏时才将手机静音。但是,在静音模式下,我希望允许用户创建电话仍应响铃的联系人列表。

为此,我创建了一个前台服务,在其中注册了一个广播接收器。但是,在活动离开前台仅几分钟后,接收器就会停止按时工作并不时更新。

此问题出现在搭载 Android 8 的设备(华为/荣耀 7x)上。

注意:我尝试将应用程序添加到Doze 白名单并禁用供应商特定的电池优化,但没有任何改变。

下面是我的代码的 MCVE。每当服务中的接收器被触发时,一些 int 值就会增加,然后它们会显示在通知中。在我的设备上,由于活动离开前台,值在几分钟后停止增加:

清单权限

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
Run Code Online (Sandbox Code Playgroud)

清单声明的服务

<service android:name=".PhoneService"/>
Run Code Online (Sandbox Code Playgroud)

在 Activity 中启动 Service

//for the sake of simplicity, I omit the code where runtime permissions are requested
Intent foregroundIntent = new Intent(this, PhoneService.class);
foregroundIntent.putExtra(PhoneService.EXTRA_ACTION, PhoneService.ACTION_START);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(foregroundIntent);
} else {
    startService(foregroundIntent);
}
Run Code Online (Sandbox Code Playgroud)

服务类

public class PhoneService extends Service {

private static final String NOTIFICATION_CATEGORY = "notification_category";
private static …
Run Code Online (Sandbox Code Playgroud)

android android-service android-broadcastreceiver android-doze

5
推荐指数
1
解决办法
3349
查看次数