2012-11-30 92 views
2

我有無盡的振動的服務後重復震動,但是當屏幕關閉振動停止。在添加了正確的BroadcastReceiver後,我注意到無論是在屏幕開啓還是關閉之後,我都無法播放重複振動。下面的實施例簡單的代碼:無法啓動SCREEN_ON意圖

//VibratingService class 
Vibrator mVibrator; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      vibrate(); 
     } 
    }, filter); 

    vibrate(); 
    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    mVibrator.cancel(); 
    super.onDestroy(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

private void vibrate() { 
    Log.d("TAG", "vibrate"); 
    mVibrator.vibrate(new long[] { 1000, 500 }, 0); //doesn't work 
    //mVibrator.vibrate(new long[] { 1000, 500 }, -1); //works 
} 

什麼是奇怪的,當重複在振動方法參數設置爲-1(未重複)振動工作,但是當設定爲其他值不起作用。

任何想法,解決方法?或者,也許它只適用於其他手機?我拼命地跑它放在谷歌Nexus和Android的4.1.2

編輯:

一些測試後,我已經確定:如果他們之前的屏幕去了被攔

  • 震動會正常啓動(但不中的onReceive - 這似乎爲時已晚)
  • 「系統振動」(例如解鎖屏幕)時,允許振動與下一屏幕開/關正常啓動。直到下一個「破發」,等等
  • (EDIT 2) - 這絕對是連接模式 - 不存在具有振動(long millis)來沒有這樣的問題 - 一切工作正常

如果我沒有找到任何「正常」的解決方案,我將只需要創建可能是我自己的振動器類...

+0

有可能是你的mVibrator是從服務的上下文中獲取上不轉播工作。嘗試在再次的onReceive獲取它(從上下文的背景下) – njzk2

+0

@ njzk2 - 我檢查了,但它似乎並不如此。它有一些震動停止在「模式」,似乎我不能正確地重新啓動它們,只有「系統振動」可以。請參閱我的編輯 – Koger

回答

0

我現在還不能確定是什麼原因導致奇怪的行爲或如果發生在其他型號的手機,但下面是一個代碼我簡單的MyVibrator類可以在屏幕開啓和關閉後工作,任何人都應該有這個問題,並且沒有更好的解決方案。

public class MyVibrator { 

Vibrator mVibrator; 
Handler mHandler = new Handler(); 

boolean mIsVibrateOn; 
private long mVibrateOnLength; 
private long mVibrateOffLength; 

private Runnable mVibrateRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if (mIsVibrateOn) { 
      mVibrator.vibrate(mVibrateOnLength); 
      postVibrateRunnable(mVibrateOnLength + mVibrateOffLength); 
     } else { 
      mVibrator.cancel(); 
     } 
    } 
}; 

public MyVibrator(Context context) { 
    mVibrator = (Vibrator) context 
      .getSystemService(Context.VIBRATOR_SERVICE); 
} 

public void vibrate(long vibrateOn, long vibrateOff) { 
    mVibrateOnLength = vibrateOn; 
    mVibrateOffLength = vibrateOff; 
    mIsVibrateOn = true; 
    postVibrateRunnable(0); 
} 

public void stopVibrating() { 
    mIsVibrateOn = false; 
    mHandler.removeCallbacks(mVibrateRunnable); 
    mVibrator.cancel(); 
} 

private void postVibrateRunnable(long delay) { 
    mHandler.removeCallbacks(mVibrateRunnable); 
    mHandler.postDelayed(mVibrateRunnable, delay); 
} 

}

它尚未經過徹底的測試,但到目前爲止,它似乎是工作的罰款。一段時間的努力它可以很容易地改變使用較長的模式