你可以使用前台服务并在前台服务中注册接收器,而不是在清单文件中注册。使用前台服务可能会减少延迟,因为前台服务比后台服务更重要,并且在前台服务中注册的接收器可能比在清单文件中注册的接收器更重要,因为您的程序始终在前台运行并在电话状态更改之前处于活动状态。
另外,我认为ACTION_PHONE_STATE_CHANGED不是有序广播,因为它不能被接收器中止,因此使用其他答案建议的优先级对其没有影响(优先级仅适用于有序广播)。
从清单文件中删除电话状态接收器,但保留BOOT_COMPLETED接收器,并在启动完成后启动以下服务。
在Service的onCreate中注册接收器。
@Override
public void onCreate() {
super.onCreate();
phoneStateReceiver = new PhoneStateReceiver();
registerReceiver(phoneStateReceiver, new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED));
}
在onDestroy中取消注册:
@Override
public void onDestroy() {
unregisterReceiver(phoneStateReceiver);
super.onDestroy();
}
向您的服务添加一个静态方法以启动服务:
static void requestStart(@NonNull final Context context, @NonNull final String action){
final Context appContext = context.getApplicationContext();
Intent intent = new Intent(appContext, AppService.class);
intent.setAction(action);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
appContext.startForegroundService(intent);
} else {
appContext.startService(intent);
}
}
在你的
onStartCommand
中启动前台。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(ACTION_START.equals(intent.getAction()))
startForeground(ID, notification);
else if(ACTION_STOP.equals(intent.getAction()))
stopForeground(true);
return START_STICKY;
}