2012-06-16 61 views
0

我想在检测到摇动事件时启动我的应用程序的活动。我希望这发生在我的应用程序之外。永久SensorEventListener震动

有很多伟大的代码片段herehere例如,如何正确实施SensorEventListener,但即使我不注销监听器,它仍然被摧毁。

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

最后,我将如何才能在显示屏上只听这种事件呢?无论如何,我知道这可能是hardware restriction

在此先感谢。

回答

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

希望这会有所帮助。

+0

感谢您的回复,它给了我一些进一步的阅读。原谅这个可能是愚蠢的问题,但是没有获得与我想要做的相反的部分唤醒锁定!?我不希望听众阻止设备进入睡眠状态... – brandall

+0

据我了解,您没有选择。在待机模式下,你的[onSensorChanged](http://developer.android.com/reference/android/hardware/SensorEventListener.html#onSensorChanged(android.hardware.SensorEvent)永远不会被调用。 –

+0

没关系,我不想要当显示器关闭时,我肯定需要使用BOOT_COMPLETED进行注册,但是当显示屏熄灭或进入待机状态时可以取消注册 - 所以我不认为我需要部分唤醒锁。但是当显示/ cpu时再次注册回到上面..? – brandall