5

Xin chào Tôi đang cố gắng sử dụng dịch vụ để điều khiển wakelock vì vậy tôi có thể vĩnh viễn thoát khỏi màn hình khi ứng dụng của tôi đang chạy. Tôi tạo wakelock và kích hoạt nó trong onCreate() và thả nó trong onDestroy() tuy nhiên tôi nhận được lỗi "wl cannot be resolve". Ai đó có thể giải thích làm thế nào tôi có thể vượt qua điều này? Mã bên dưới:Sử dụng khóa điện thoại trong một dịch vụ Android 1.5

public class WakeLockService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
    } 
    @Override 
    public void onDestroy() { 
     wl.release(); 
    } 
} 

Trả lời

5

Không phải bạn thiếu dòng

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 

trong onDestroy()? Nó là một biến cục bộ trong onCreate(), nhưng nó không được khai báo trong onDestroy().

Hoặc, có thể xảy ra hơn, bạn có thể muốn biến nó thành trường WakeLockService thay vì biến cục bộ.

9

Vâng, ngay cả khi bạn sử dụng biến mẫu, tôi nghĩ đây không phải là cách để thực hiện. Ai sẽ gọi destroy()? Tôi hy vọng không phải bạn, đó là công việc hệ điều hành để làm như vậy. Nhưng khi bạn đang nắm giữ một khóa thức, rất khó có khả năng phương thức destroy() của bạn được gọi, vì hệ điều hành trước tiên sẽ hủy các hoạt động/dịch vụ khác.

Bên cạnh đó, đã quá trễ để có được khóa đánh thức theo phương pháp onCreate(). Trước khi onCreate() đạt đến điện thoại có thể đã chuyển sang chế độ ngủ khi bạn kích hoạt Dịch vụ từ báo thức so với hoạt động ở chế độ nền.

Thật khó để nói những gì bạn nên làm khác nhau khi bạn không đưa ra nhiều ngữ cảnh. Các khóa học thông thường của sự kiện là điều này. A BroadcastReceiver được gọi và trong số onReceive() bạn có được khóa thức và đặt nó trong biến tĩnh trên dịch vụ của bạn. Khi dịch vụ được thực hiện, nó sẽ gọi stopSelf(), nhả khóa thức và sau đó vô hiệu biến tĩnh giữ tham chiếu đến khóa.

Ngoài ra, nếu bạn sử dụng Khóa dịch vụ toàn thức thì rất có thể không phải là thứ bạn muốn, nhưng khóa chế độ thức một phần là. Bạn không cần màn hình để ở lại, phải không?

Rất tiếc, nhưng các khóa thức thức thực sự phức tạp khi sử dụng, vì chính xác các vấn đề tôi đã mô tả ở trên. Đó chắc chắn là một chủ đề nâng cao và thật dễ dàng để xoay xở. Nếu bạn làm như vậy, ứng dụng của bạn sẽ nhận được những nhận xét rất xấu, vì việc giữ quá lâu là một hành vi phạm tội lớn vì nó tiêu hao pin. Đừng làm điều này một cách sai lầm, nhưng vì bản chất của vấn đề bạn đã đăng ở đây (lỗi cú pháp/biên dịch), tôi khuyên bạn nên tìm kiếm giải pháp không có Dịch vụ và khóa đánh thức.

+0

Cảm ơn nhận xét. Trong ứng dụng tôi đang làm việc trên tôi cần điện thoại ở chế độ thức dậy 100% vì vậy tại sao tôi sử dụng khóa chế độ thức giấc đầy đủ. – Tom

+0

Một phần wakelock đủ để cấp nguồn cho CPU và sử dụng mạng. – Eno

+0

Cũng xin cảm ơn tôi. Lời giải thích của bạn ngắn gọn và hữu ích hơn câu hỏi và câu trả lời được kết hợp :) – Melllvar