2012-04-27 14 views
7

Hoạt động của tôi chạy bằng khóa chế độ thức một phần vì nó liên tục xử lý dữ liệu Bluetooth đã nhận. Khóa chế độ thức được thiết lập như sau:Cách bật màn hình trong khi khóa chế độ thức một phần

powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
    wakeLock.acquire(); 

Khi xảy ra sự kiện nhất định, tôi muốn hiển thị trên màn hình để người dùng có thể xem trạng thái. Tôi muốn màn hình tự động bật, không phải do người dùng nhấn phím. Tuy nhiên mọi nỗ lực để thực hiện việc này đều thất bại. Khi màn hình tắt khi đang chạy với khóa chế độ thức một phần, nỗ lực của tôi để bật lại màn hình và cho phép người dùng thấy hoạt động hiện tại không thành công. Tôi đã cố gắng giả mạo hoạt động người dùng:

PowerManager NewPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    NewPowerManager.userActivity(1, false); 

cờ Cài đặt cho cửa sổ:

Window win = getWindow(); 
    win.setFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Và thậm chí phát hành khóa trỗi dậy và bắt đầu khác mà nên bật màn hình:

if (wakeLock != null) 
    { 
     wakeLock.release(); // release the wakelock 
    } 
PowerManager.WakeLock TempWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
    PowerManager.ACQUIRE_CAUSES_WAKEUP, "TempWakeLock"); 
    // tried | PowerManager.ON_AFTER_RELEASE to no avail 
    TempWakeLock.acquire(); 

Có điều gì tôi thiếu ở đây không? Tôi không cố gắng mở một hoạt động mới, nhưng chỉ hiển thị hoạt động hiện tại của tôi cho người dùng. Có ai khác có thể làm điều này không? Cảm ơn sự giúp đỡ nào bạn có thể cho tôi.

Trả lời

9

Cuối cùng tôi đã có thể giải quyết vấn đề này sau khi nhìn thấy một số mã demo từ Lance tại HTC (cảm ơn bằng cách này).

Bí mật có vẻ là tạo khóa bổ sung đầy đủ với bộ ACQUIRE_CAUSES_WAKEUP. Tôi không giải phóng khóa đánh thức một phần ban đầu, nhưng khi tôi muốn bật màn hình, tôi tạo khóa toàn thức mới, làm công cụ của tôi, sau đó nhả khóa toàn thức mới. Điều này thực sự hoạt động!

PowerManager TempPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock TempWakeLock = TempPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | 
PowerManager.ON_AFTER_RELEASE, "TempWakeLock"); 
TempWakeLock.acquire(); 

// do the work that needs the visible display... 

// Release the newest wakelock and fall back to the old one 
TempWakeLock.release();