首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onSensorChanged在睡眠后大约5分钟内不工作,直到app被打开。

onSensorChanged在睡眠后大约5分钟内不工作,直到app被打开。
EN

Stack Overflow用户
提问于 2017-09-28 18:40:20
回答 1查看 664关注 0票数 2

我正面临着一些奇怪的问题。我有一个接收传感器更新的服务。一切正常工作,直到屏幕关闭一段时间。在此之后,onSensorChanged才会被调用,直到我从launcher打开应用程序。

这是我的服务班:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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在睡眠中不起作用的问题,但情况有点不同。

已经尝试过分区唤醒锁和从另一个线程注册侦听器,但是没有帮助。

有没有人遇到过类似的情况?期待您的建议,并感谢您的提前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 13:20:16

我没有找到这个问题的原因,但找到了解决办法。就像我说的

当我打开5分钟或更长时间的屏幕时,onSensorChanged直到我打开应用程序才会启动,然后它会立即启动,不需要任何调用。

因此,我创建了一个没有UI的空活动,并在醒来后立即调用它,并在onCreate中完成它。通过这种方式,我能够让onSensorChanged开始在我的服务中工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46476205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档