永久SensorEventListener Shake

时间:2012-06-16 17:03:59

标签: java android

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

有许多优秀的代码段herehere,例如,如何正确实现SensorEventListener,但即使我没有取消注册侦听器,它仍会被销毁

如何防止它被销毁并注册“永久”的监听器?我在任何地方都找不到任何这样的例子......任何链接或指导都会非常感激。

最后,当显示器打开时,我将如何仅监听此类事件?我知道无论如何这可能是hardware restriction

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以为BOOT_COMPLETED intent注册广播接收器,并在onReceive中使用PARTIAL_WAKELOCK启动后台服务,然后注册您的传感器事件监听器。像这样:

@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;
    }
}

希望这有帮助。