2012-02-28 42 views
49

Tôi đã tự hỏi liệu có thể đăng ký bộ thu phát sóng phát hiện BẬT/TẮT màn hình trong tệp kê khai ứng dụng hay không. Lý do tại sao tôi không thích phương pháp có thể lập trình là nó yêu cầu ứng dụng chạy để phát hiện một điều như vậy, trong khi: "Các ứng dụng với Người nhận phát sóng đã đăng ký trong tệp kê khai không phải chạy khi ý định được phát sóng cho người nhận để thực hiện"(nguồn: Professional Android 2 ứng dụng cuốn sách phát triển)android: bộ thu phát sóng cho màn hình bật và tắt màn hình

ứng dụng của tôi thực sự là một ứng dụng lockscreen đó bằng cách lập trình cần phải chạy tất cả các thời gian: S

is có một cách xung quanh nó?

Tôi đang cố gắng điều sau đây trong manifest:

<receiver android:name=".MyBroadCastReciever"> 
    <intent-filter> 
     <action android:name="android.intent.action.SCREEN_OFF"/> 
     <action android:name="android.intent.action.SCREEN_ON"/> 
    </intent-filter> 
</receiver> 

và lớp MyBroadCastReciever đơn giản:

public class MyBroadCastReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      Log.i("Check","Screen went OFF"); 
      Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show(); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      Log.i("Check","Screen went ON"); 
      Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

bạn có thể cho tôi mẫu làm việc không? Tôi muốn làm điều gì đó khi khóa màn hình hoặc mở khóa. –

Trả lời

66

Hai hành động cho màn hình và tắt là:

android.intent.action.SCREEN_OFF 
android.intent.action.SCREEN_ON 

Nhưng nếu bạn đăng ký một máy thu cho các chương trình phát sóng này trong một tệp kê khai, thì người nhận sẽ không nhận được các chương trình phát sóng này S.

Đối với vấn đề này, bạn phải tạo một dịch vụ chạy dài, đăng ký bộ thu phát sóng nội bộ cho các mục đích này. Nếu bạn làm theo cách này, sau đó ứng dụng của bạn sẽ tìm kiếm màn hình tắt chỉ khi dịch vụ của bạn đang chạy mà sẽ không kích thích người dùng.

PS: bắt đầu dịch vụ ở nền trước để làm cho dịch vụ chạy lâu hơn.

Một đoạn mã đơn giản sẽ là một cái gì đó như thế này:

IntentFilter screenStateFilter = new IntentFilter(); 
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
registerReceiver(mScreenStateReceiver, screenStateFilter); 

Đừng quên để unregister nhận trong Dịch vụ 's onDestroy:

unregisterReceiver(mScreenStateReceiver); 

Chỉ trong trường hợp cho những người đang hỏi tại sao người nhận không làm việc với các chương trình phát sóng tuyên bố trong tệp kê khai cho ACTION_SCREEN_ON và ACTION_SCREEN_OFF:

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ONhttps://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

Bạn không thể nhận này thông qua các thành phần khai báo trong biểu hiện, chỉ bằng cách đăng ký một cách rõ ràng cho nó với Context.registerReceiver().

Đây là mục đích được bảo vệ mà hệ thống chỉ có thể gửi.

+4

ok để không có cách nào xung quanh nó? đây là cách ứng dụng lockscreen được thực hiện? – himura

+4

câu trả lời tuyệt vời, nhưng tại sao máy thu không hoạt động đối với các chương trình phát sóng này trong tệp kê khai? –

+1

Nếu bạn có thể nghe ACTION_SCREEN_OFF trong tệp kê khai, Hệ điều hành sẽ phải bắt đầu một quy trình mới cho ứng dụng của bạn nếu ứng dụng không chạy khi chương trình phát sóng được kích hoạt. Các nhà thiết kế Android muốn ngăn chặn điều này, vì nó thường ngụ ý rằng thiết bị sắp bước vào trạng thái năng lượng thấp. –

0

Bạn cần tạo dịch vụ nền để kiểm tra. Sau đó, bạn có thể đặt nó theo lập trình.

Các vấn đề liên quan