我正在尝试创建一个应用程序,允许用户在设置的时间间隔内或手动使设备静音。我还希望用户能够输入更复杂的规则,例如仅在连接到某个 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