2012-06-16 58 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