我面临一些奇怪的问题。 我有一个接收传感器更新的服务。一切正常,直到屏幕关闭一段时间。之后,在我从启动器打开应用程序之前,不会调用onSensorChanged。
这是我的服务类:
public class MyService extends Service implements OrientationMonitor.Listener, ScreenReceiver.ScreenStateListener {
private final OrientationMonitor orientationMonitor = new OrientationMonitor(this);
private final ScreenReceiver screenReceiver = new ScreenReceiver(this);
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
orientationMonitor.start();
screenReceiver.register();
}
@Override
public void onDestroy() {
super.onDestroy();
orientationMonitor.stop();
screenReceiver.unregister();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void screenStateChanged(boolean isScreenOn) {
if (isScreenOn) {
orientationMonitor.start();
} else {
orientationMonitor.stop();
}
}
}
以下是OrientationMonitor的代码:
public class OrientationMonitor implements SensorEventListener {
private final Listener listener;
private final WindowManager windowManager;
private final SensorManager sensorManager;
private final Sensor rotationSensor;
public OrientationMonitor(@NonNull Listener listener) {
this.listener = listener;
windowManager = (WindowManager) AppContext.get().getSystemService(Context.WINDOW_SERVICE);
sensorManager = (SensorManager) AppContext.get().getSystemService(Context.SENSOR_SERVICE);
rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
}
public void start() {
if (rotationSensor != null)
sensorManager.registerListener(this, rotationSensor, 10_000);
}
public void stop() {
if (rotationSensor != null)
sensorManager.unregisterListener(this, rotationSensor);
}
@Override
public void onSensorChanged(SensorEvent event) {
//Here some work is performed
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public interface Listener {
void onOrientationChanged(int angle);
}
}
在工作期间,当应用程序最小化并且当屏幕关闭时,服务接收通知并停止(取消注册)旋转传感器。当屏幕打开时,它会再次注册。如果我关闭屏幕一段时间,不超过1-2分钟,那么一切都很好,onSensorChanged正常发射。
但是当我将屏幕旋转5分钟或更长时间时,onSensorChanged在我打开应用程序之前不会触发,然后它立即触发而不进行任何调用。但是,在调试过程中,我看到 sensorManager.registerListener(this,rotationSensor,10_000); 在屏幕打开时被调用。
我发现很多关于onSensorChanged在睡眠期间没有工作的问题,但情况稍有不同。
已尝试过部分唤醒锁定并从另一个线程注册侦听器,但它没有帮助。
有没有人有类似的情况?期待您的建议,并提前感谢您。
答案 0 :(得分:0)
我没有找到这个问题的原因,但找到了解决方案。 正如我所说
当我打开5分钟或更长时间的屏幕时,onSensorChanged在我打开应用程序之前不会触发,然后它立即触发而不进行任何调用
所以,我创建了一个没有UI的空活动,我在唤醒后立即调用它并在onCreate中完成它。通过这种方式,我可以让onSensorChanged开始在我的服务中工作。