У меня довольно странная проблема. В последнее время я попытался использовать wakelock в своем приложении, используя следующий код:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
screenLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNotDimScreen");
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("Clicked");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!locked)
setKeepScreenOn(WakeupLightActivity.this, true);
else setKeepScreenOn(WakeupLightActivity.this, false);
System.out.println("Screen will stay on");
}
});
}
public void setKeepScreenOn(Activity activity, boolean keepScreenOn) {
if(keepScreenOn) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
this.screenLock.acquire();
}
else {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
this.screenLock.release();
}
}
Wakelock отлично работает: через 5 секунд после нажатия кнопки (и блокировки моего телефона) экран включается. Этот тест, однако, был выполнен, когда мой телефон был подключен к моему ноутбуку для отладки с помощью USB-кабеля.
Теперь наступает странная часть. Когда я НЕ подключу свой телефон к USB-кабелю, Wakelock просто НЕ включает экран. Устройство, которое я использую, - это желание HTC. Я действительно протестировал его на другом желании HTC, который сделал то же самое. Затем я попробовал его на HTC Desire HD. И угадайте, что: он отлично справился! Я действительно смущен этим и задаюсь вопросом, является ли проблема просто недостатком в моем типе телефона, или если я делаю что-то неправильно в своем коде. Могу ли я что-нибудь сделать? Было бы невероятно неудобно, если бы у потенциальных клиентов с неисправным типом телефона возникла бы такая же проблема после покупки моего приложения.
Обратите внимание, что я также попробовал приложение во время зарядки телефона с помощью кабеля, подключенного к сетевой розетке. Это приводит к той же проблеме, что и мой телефон. Оба HTC Desires запускают ту же версию Android (2.2.2).
Видимо, все это происходило просто потому, что я использовал неправильные флаги. Проблема была решена путем создания WakeLock со следующими флагами:
PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP