2013-01-11 17 views
11

Tôi biết rằng câu hỏi này đã được hỏi rất nhiều lần nhưng chưa bao giờ được trả lời thỏa đáng.Android - Tắt màn hình mà không tham gia Chế độ StandBy

Sự cố của tôi là như sau:

Tôi có hoạt động ngăn màn hình tắt trong một khoảng thời gian xác định trước.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Khi thời gian được xác định trước kết thúc, tôi sẽ hiển thị hộp thoại đếm ngược để thông báo cho người dùng rằng màn hình sẽ tắt sau 10 giây nếu anh ấy không nhấn "hủy".

Tôi đã tắt chế độ hiển thị nhưng điện thoại luôn chuyển sang chế độ StandBy.

Đối tắt tôi đã sử dụng:

Window mywindow = getWindow(); 

WindowManager.LayoutParams lp = mywindow.getAttributes(); 

lp.screenBrightness = 0.0f; 

mywindow.setAttributes(lp); 

Có khả năng hoàn toàn tối đen màn hình mà không đi đến Standby-Mode (trong đó tạm dừng hoạt động).

Mục tiêu của tôi là người dùng có thể chỉ cần nhấn vào màn hình để làm sáng màn hình một lần nữa. Vì vậy, hoạt động phải ở trạng thái hoạt động.

Câu hỏi tương tự đã được hỏi here.

Vì câu hỏi này đã gần một tuổi, tôi hy vọng rằng có thể ai đó đã quản lý được điều này trong thời gian đó.

Rất nhiều lời chúc mừng

Siggy

+0

Bạn đã thử ['PowerManager'] (http://developer.android.com/reference/android/os/PowerManager.html) chưa? Điều đó có thể giúp bạn bật và tắt màn hình. Mặc dù tôi lo sợ nó có thể vô hiệu hóa hoạt động của bạn nhận các sự kiện cảm ứng. –

+1

Ngoài khả năng có thể hay không, tôi không chắc liệu đây có phải là một ý tưởng tốt để thực hiện hay không. Khi màn hình tắt, người dùng hy vọng rằng màn hình sẽ ở chế độ chờ. Có nghĩa là không có quy trình nào khác đang được chạy có khả năng tiết kiệm pin. Nhưng cũng có nghĩa là thiết bị bị khóa và mã pin hoặc thứ gì đó phải được điền để mở khóa. Bạn không nên sợ "tạm dừng" một ứng dụng. Trên thực tế nó sẽ bị "ngừng" xem xét Vòng đời hoạt động của Android. Tạm dừng là khi một hộp thoại được mở chẳng hạn, không phải khi thiết bị bật sáng. –

+0

@Singularity Tôi hiện đang chơi xung quanh với 'PowerManager' và' WakeLocks' một chút nhưng tôi couln't đạt được xử lý chính xác tôi muốn có được nêu ra. – Siggy

Trả lời

7

Có vẻ như nó không phải là có thể tắt màn hình và kích hoạt chỉ bằng cách chạm vào màn hình.

cách tiếp cận mới của tôi bây giờ:

private WakeLock screenWakeLock; 

PowerManager pm = PowerManager.getSystemService(Context.POWER_SERVICE); 
screenWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
           "screenWakeLock"); 
screenWakeLock.acquire(); 

Các PARTIAL_WAKE_LOCK giữ CPU chạy nhưng cho phép màn hình để tắt.

Khi nút nguồn hoặc nút trang chủ được nhấn, màn hình sẽ bật lại và hoạt động sẽ hiển thị trở lại (không cần phải "trượt để mở khóa" hoặc sth. Khác).

Đừng quên giải phóng screenWakeLock.

Trong trường hợp của tôi, tôi đã làm điều đó trong onResume() của hoạt động:

if (screenWakeLock != null) { 
    if(screenWakeLock.isHeld()) 
     screenWakeLock.release(); 
    screenWakeLock = null; 
} 

Có lẽ điều này giúp ai đó với một vấn đề tương tự trong tương lai.

+1

1 nhưng lưu ý rằng các khóa trỗi dậy bị phản đối như của API 13 (bạn vẫn có thể sử dụng nó trong phiên bản cao hơn nếu bạn chỉ định minSDK nhỏ hơn 13). – ripopenid

+0

Trong các phiên bản mới hơn của API, bạn phải sử dụng nó như sau: 'PowerManager pm = (PowerManager) getBaseContext(). GetSystemService (Context.POWER_SERVICE);' – forresthopkinsa

1

Lưu ý: tôi đã không thể làm việc với WAKELOCK

tôi đã tìm một cách giải quyết đó bao gồm việc thay đổi SCREEN_OFF_TIMEOUT. Sử dụng mã bên dưới để đạt được điều đó.

Settings.System.putInt(getContentResolver(), 
          Settings.System.SCREEN_OFF_TIMEOUT, 10); 

bộ này 10 mili giây như timeout cho screen_timeout SYSTEM-WIDE.

Bây giờ bạn có thể gặp khó khăn bởi những thay đổi SYSTEM-WIDE do điều này gây ra. Để làm việc xung quanh bạn có thể nhận được screen_timeout_time mặc định và lưu nó vào một biến, sau đó thiết lập lại SCREEN_OFF_TIMEOUT của hệ thống khi kết thúc() hoạt động của bạn.

Trước khi cài đặt 10ms như screen_timeout của chúng tôi có được SCREEN_OFF_TIMEOUT,

int defaultScreenTimeout= android.provider.Settings. 
     System.getInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,-1); 

Bây giờ khi bạn đã hoàn thành với những thay đổi của bạn hoặc khi hoạt động của bạn kết thúc, bạn có thể thiết lập các SCREEN_OFF_TIMEOUT lại.

@Override 
public void finish(){ 
    Settings.System.putInt(getContentResolver(), 
         Settings.System.SCREEN_OFF_TIMEOUT, defaultScreenTimeout); 
super.finish(); 
} 
Các vấn đề liên quan