我在一个需要关闭屏幕的情况下进行一些蓝牙扫描的应用程序中。我使用前台服务来设置接收器,该前台服务使用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设备,所以没有用...
答案 0 :(得分:0)
当Android进入打ze模式时,您可能正在挂起AlarmManager。 Android 6引入了Doze来关闭不动的手机,而Android 7引入了轻度的Doze模式,即使手机不是一动不动(例如放在口袋里),它也可以在屏幕关闭后几秒钟启动。
如果这是问题,最好的避免方法是停止使用AlarmManager进行定时处理。考虑使用具有postDelayed的Handler,该处理器不受Doze的影响。如果必须使用AlarmManager,请参阅here,以了解可能产生的迫使其触发的危险。例如,Android信标库甚至在打ze模式下也使用处理程序来循环扫描。
OnePlus还具有一些专有的省电功能,这些功能会在延长应用程序运行时间后最终终止您的前台服务。但这听起来不是您现在面临的问题。