Java 永久传感器事件侦听器抖动

Java 永久传感器事件侦听器抖动,java,android,Java,Android,我想在检测到震动事件时启动应用程序的活动。我希望这种情况发生在我的申请之外 有很多很棒的代码片段,例如,关于如何正确实现的,但是即使我没有注销侦听器,它仍然会被销毁 如何防止它被破坏并注册一个“永久”侦听器?我在任何地方都找不到这样的例子。。。任何链接或指导都将不胜感激 最后,当显示器打开时,我如何只收听此类事件?我知道这可能是一个问题 提前感谢。您可以注册广播接收器,并在中使用启动后台服务,然后注册传感器事件侦听器。大概是这样的: @Override public int onStartCom

我想在检测到震动事件时启动应用程序的活动。我希望这种情况发生在我的申请之外

有很多很棒的代码片段,例如,关于如何正确实现的,但是即使我没有注销侦听器,它仍然会被销毁

如何防止它被破坏并注册一个“永久”侦听器?我在任何地方都找不到这样的例子。。。任何链接或指导都将不胜感激

最后,当显示器打开时,我如何只收听此类事件?我知道这可能是一个问题


提前感谢。

您可以注册广播接收器,并在中使用启动后台服务,然后注册传感器事件侦听器。大概是这样的:

@Override
public int onStartCommand(Intent i, int flags, int startId) {
    acquireWakeLock();
    registerSensorListener();
    return START_STICKY;
}

@Override
public void onDestroy() {
    unregisterSensorListener();
    releaseWakeLock();
    super.onDestroy();
}

private void acquireWakeLock() {
    try {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (pm == null) {
            Log.e(TAG, "Power manager not found!");
            return;
        }
        if (wakeLock == null) {
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getPackageName());
            if (wakeLock == null) {
                Log.e(TAG, "Could not create wake lock (null).");
                return;
            }
        }
        if (!wakeLock.isHeld()) {
            wakeLock.acquire();
            if (!wakeLock.isHeld()) {
                Log.e(TAG, "Could not acquire wake lock.");
            }
        }
    } catch (RuntimeException e) {
        Log.e(TAG, "Caught unexpected exception: " + e.getMessage(), e);
    }
}

private void releaseWakeLock() {
    if (wakeLock != null && wakeLock.isHeld()) {
        wakeLock.release();
        wakeLock = null;
    }
}

希望这能有所帮助。

谢谢你的回复,这给了我一些进一步的阅读。请原谅这个也许很愚蠢的问题,但是获得一个部分唤醒锁不是与我想做的相反吗!?我不希望监听器阻止设备睡眠……据我所知,你别无选择。在待机模式下,您的[onSensorChanged](将永远不会被调用。没关系,我不希望它在显示器关闭时被调用。我确实需要使用BOOT_COMPLETED进行注册,但可以在显示器关闭或进入待机状态时取消注册-因此我认为我不需要部分唤醒锁。但在显示器/cpu重新打开时再次注册…?好的,然后在您的