我正在一个应用程序中工作,我们需要在屏幕关闭时进行一些蓝牙扫描。我使用一个使用AlarmManager类每分钟运行的前台服务来设置接收器。问题是,使用我的Oneplus 6(Android版本9.0),它不会在屏幕关闭的情况下运行,但是当屏幕打开时,一切都运行得很好。
你知道它是否与Android版本有关吗?
如果您需要更多部分代码,请告诉我。
谢谢!
这是我注册接收器的地方
public void registerReceivers(Context context) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
context.registerReceiver(btReceiver,intentFilter);
}
然后,这是我在注册接收器后开始发现的方式
public void startScan(Context context){
registerReceivers(context)
btReceiver.startScan(context);
}
其中btReceiver是以下对象
public class BtReceiver extends BroadcastReceiver {
//BtConn is an object that store some information about the founded device
public final List<BtConn> btConns;
public BluetoothAdapter bluetoothAdapter;
public BtReceiver() {
super(ScanType.BLUETOOTH);
this.btConns = new ArrayList<>();
this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
public void onReceive(Context context, Intent intent) {
String action =intent.getAction();
//Case when a device has been found
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//Getting device values
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String deviceName = device.getName();
String macAddress = device.getAddress();
int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);
//Checking if it is a Phone by default is True
boolean isMobile = true;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
isMobile = BluetoothDevice.DEVICE_TYPE_CLASSIC == device.getType();;
}
//adding object to list
if(deviceName != null && deviceName.length() > 0) { btConns.add(new BtConn(deviceName,rssi, macAddress,isMobile)); }
return;
}
if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { scanFinished(context);return; }
}
public void startScan(Context context) {
this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.startDiscovery();
}
public void scanFinished(context) {
//Here there is some stuff to upload the information to the database
}
}
然后在我的服务的onStartCommand中运行:
public int onStartCommand(Intent intent, int flags, int startId) {
startForeground(ID_NOTIFICATION, myCustomNotification()));
startScan(this);
return START_STICKY;
}
[编辑]
我试过,使用处理程序而不是AlarmManager,但它具有相同的行为。当屏幕关闭时,一旦我调用startDiscovery方法,它似乎不起作用。而且,我没有使用我用BLE扫描测试的发现方法。这种扫描在屏幕熄灭时有效,但我想找到其他Android设备,所以没用......
当Android进入打盹模式时,您可能会遇到暂停AlarmManager的情况。 Android 6推出了Doze用于屏幕关闭静态手机,Android 7推出了一种轻度打盹模式,即使手机没有静止(例如在你的口袋里),屏幕关闭后几秒钟也会启动。
如果这是问题,避免它的最佳方法是停止使用AlarmManager进行定时处理。考虑使用带有postDelayed的Handler,它不受Doze的影响。如果必须使用AlarmManager,请参阅here以获取可能的阻止它们发射的kludges。例如,Android Beacon Library使用处理程序即使在打盹模式下也可以循环扫描。
OnePlus还具有一些专有的电池节电功能,这些功能最终会在延长应用运行时间后终止您的前台服务。但听起来这不是你面临的问题..