2013-05-29 28 views
13

Tôi cần giữ cho bộ thu phát sóng luôn chạy mọi lúc sau khi ứng dụng được khởi động.Giữ cho bộ thu phát sóng chạy sau khi ứng dụng được đóng

Đây là đoạn mã dùng để đăng ký nhận này trong ứng dụng

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    BroadcastReceiver mReceiver = new ScreenEventsReceiver(); 
    registerReceiver(mReceiver, filter); 

Và mã cho thu

public class ScreenEventsReceiver extends BroadcastReceiver { 
    public static boolean wasScreenOn = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      wasScreenOn = false; 
      Log.d("ScreenEventReceiver", "ON"); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      wasScreenOn = true; 
      Log.d("ScreenEventReceiver", "ON"); 
     } 
    } 
} 
+0

Bạn có thể muốn tạo [dịch vụ] (https://developer.android.com/reference/android/app/Service.html) –

+0

Nhưng điều gì về việc nhận sự kiện? –

+1

Bạn có thực sự cần theo dõi các sự kiện bật/tắt màn hình không? Lý do khiến họ buộc bạn đăng ký người nhận không có trong bản kê khai là họ không muốn mọi người luôn theo dõi những sự kiện này và làm chậm thiết bị. – natez0r

Trả lời

17

Bạn có thể sử dụng dịch vụ

Trong bắt đầu ứng dụng chính/dừng dịch vụ

Intent service = new Intent(context, MyService.class); 
context.startService(service); 
... 
Intent service = new Intent(context, MyService.class); 
context.stopService(service); 

dịch vụ

public class MyService extends Service 
{ 
private static BroadcastReceiver m_ScreenOffReceiver; 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    return null; 
} 

@Override 
public void onCreate() 
{ 
    registerScreenOffReceiver(); 
} 

@Override 
public void onDestroy() 
{ 
    unregisterReceiver(m_ScreenOffReceiver); 
    m_ScreenOffReceiver = null; 
} 

private void registerScreenOffReceiver() 
{ 
    m_ScreenOffReceiver = new BroadcastReceiver() 
    { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    Log.d(TAG, "ACTION_SCREEN_OFF"); 
    // do something, e.g. send Intent to main app 
    } 
    }; 
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    registerReceiver(m_ScreenOffReceiver, filter); 
} 
} 
+0

Điều này phải được chấp nhận làm câu trả lời. – Talha

0

Bạn có thể bắt đầu một dịch vụ đang chạy ở nền trước. Đó là cách duy nhất để đảm bảo (chủ yếu) rằng ứng dụng của bạn sẽ nhận được các sự kiện. Vẫn còn một cơ hội mà dịch vụ tiền cảnh của bạn có thể bị giết trong thời gian áp lực bộ nhớ điên rồ từ hệ điều hành (vì vậy nó không phải là dễ dàng). Nếu bạn bắt đầu một dịch vụ ở nền trước, người dùng sẽ thấy một thông báo liên tục để biết rằng nó luôn chạy.

Vì vậy, đạo đức của câu chuyện là, bạn có thực sự cần giám sát màn hình tắt/bật các sự kiện vào mọi lúc không? Lý do khiến họ buộc bạn đăng ký người nhận không có trong bản kê khai là họ không muốn mọi người luôn theo dõi những sự kiện này và làm chậm thiết bị. Bạn đang cố gắng để thực hiện?

5

Nếu bạn khai báo BroadcastReceiver trong Manifest, nó sẽ luôn luôn được kích hoạt và được gọi ngay cả khi ứng dụng được đóng/dừng

+5

SCREEN_ON và SCREEN_OFF không thể khai báo trong tệp kê khai. – alfoks

+0

@alfoks: tại sao SCREEN_ON và SCREEN_OFF không thể khai báo trong AndroidManifest? Bạn có thể giải thích – Kushal

+0

@Kushal Nó chỉ là cách họ đã chọn để thực hiện nó. Tôi không nhớ lý do đằng sau chuyện này. – alfoks

0

Bạn không thể nhận một số sự kiện quảng bá thông qua các thành phần khai báo trong manifest.

Những sự kiện này

  • ACTION_BATTERY_CHANGED
  • ACTION_CONFIGURATION_CHANGED
  • ACTION_SCREEN_OFF (Bạn đang chơi với sự kiện này)
  • ACTION_SCREEN_ON (Bạn đang chơi với sự kiện này)
  • ACTION_TIME_TICK

Reference https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON

Vì vậy, trong các sự kiện cụ thể của bạn, bạn sẽ phải tạo ra một dịch vụ & bạn sẽ phải đăng ký sự kiện của bạn một cách rõ ràng phục vụ onCreate() với với Context.registerReceiver().

Đối với các sự kiện khác, mục nhập trong tệp kê khai là đủ.

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