2010-09-01 10 views
6

Tôi gặp sự cố khi mua WakeLock. Có vẻ như không hoạt động. Tôi đang cố gắng để có được một FULL_WAKE_LOCK nhưng không hiển thị được kích hoạt cũng không phải là ứng dụng của tôi có thể thực hiện nhiệm vụ.Android WakeLock

Tôi đang sử dụng các quyền sau: android.permission.WAKE_LOCK

đang Acquire của tôi trông như thế này:

PowerManager pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag"); 
wl.acquire(); 

am i làm gì sai?

Chỉnh sửa: Thêm một ACQUIRE_CAUSES_WAKEUP cờ ... nhưng không có thay đổi trong hành vi

Edit2: Tất cả tôi đang cố gắng làm là, để chơi nhạc và để đánh thức điện thoại của tôi lên trên một sự kiện nào đó. Âm nhạc hoạt động hoàn hảo nhưng thiết bị vẫn đen.

Trả lời

1

Bạn lấy khóa đánh thức ở đâu? Bạn sẽ cần phải có được nó trong nhận của ý định, không phải trong dịch vụ/hoạt động mà ý định của bạn bắt đầu.

+0

tôi đang mua lại nó trong một anctivity vì tôi có một hoạt động thiết lập như nhận – Coxer

+0

Tôi không chắc là tôi hiểu. Một Activity không thể là BroadcastReceiver vì BroadcastReceiver là một lớp trừu tượng không phải là một giao diện (không có nhiều thừa kế trong Java). Bạn có nghĩa là bạn có một BroadcastReceiver tĩnh tư nhân trên lớp hoạt động? Tất cả những gì tôi nói là bạn phải lấy khóa đánh thức trong onReceive() trong BroadcastReceiver không có trong onCreate() của Activity mà bạn bắt đầu từ dịch vụ. –

7

WakeLock là một cách không hiệu quả để giữ màn hình bật. Thay vào đó, hãy sử dụng WindowManager để thực hiện phép thuật. Một dòng sau sẽ đủ cho WakeLock. Giấy phép WakeLock cũng cần thiết cho việc này. Mã này cũng hiệu quả hơn wakeLock.

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

Bạn không cần phải bỏ qua WakeLock theo cách thủ công. Mã này sẽ cho phép Hệ thống Android xử lý Khóa tự động. Khi ứng dụng của bạn nằm trong Foreground thì WakeLock được giữ lại và hệ thống Android khác sẽ tự động phát hành Khóa.

Nhưng nếu bạn muốn phát hành cờ, bạn có thể làm điều đó với:

getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 
+0

Trong các thử nghiệm của tôi, điều này chỉ hoạt động nếu bạn gọi nó trong phương thức onCreate của hoạt động. Ví dụ. nếu bạn thêm FLAG_KEEP_SCREEN_ON vào onCreate thì cố gắng xóa nó sau này sẽ không có hiệu lực và ngược lại. Thử nghiệm trên ICS 4.0.3 –

+0

bạn có thể sử dụng nó ở mọi nơi. Bạn cần sử dụng ngữ cảnh. –

3
private static PowerManager.WakeLock lockStatic = null; 
private static String LOCK_NAME_STATIC = "MyWakeLock"; 

public static void acquireStaticLock(Context context) { 
    getLock(context).acquire(); 
} 

synchronized private static PowerManager.WakeLock getLock(Context context) { 
    if (lockStatic == null) { 
     PowerManager mgr = (PowerManager) context 
       .getSystemService(Context.POWER_SERVICE); 
     lockStatic = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, 
       LOCK_NAME_STATIC); 
     lockStatic.setReferenceCounted(true); 
    } 

    return (lockStatic); 
} 

Cách sử dụng:

Gọi acquireStaticLock() khi bạn cần phải acuire khóa

Gọi getLock(this).release(); hoạt động bên trong khi bạn cần nhả khóa

Ngoài ra thêm sự cho phép trong tập tin minifest:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+1

Bạn sẽ cần phải xác định LOCK_NAME_STATIC để sử dụng mã ở trên. Ví dụ. chuỗi tĩnh riêng LOCK_NAME_STATIC = "MyWakeLock"; –