2010-01-26 29 views
8

Tôi có một đoạn mã mà tôi đang gọi từ một dịch vụ:registerReceiver cho Broadcast chỉ khi nó chưa được đăng ký?

context.registerReceiver(new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      WifiManager mWm = (WifiManager) context 
        .getSystemService(Context.WIFI_SERVICE); 
      ret = mWm.isWifiEnabled(); 
      // DO MORE STUFF HERE 
     } catch (Exception e) { 
     } 
    } 
}, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); 

Những gì tôi muốn là một cách để kiểm tra và chắc chắn rằng registerReceiver chưa được nghe trước khi nó gọi nó một lần nữa. Điều này có thể không?

Ví dụ: nếu đoạn mã của tôi nằm trong phương thức và tôi gọi phương thức 10 lần, ngay bây giờ, phương thức onReceive xuất hiện để chạy 10 lần.

Trả lời

13

Không có cách nào để tìm ra — bạn chỉ nên gọi registerReceiver một lần, rất có thể khi tạo dịch vụ của bạn.

Bạn cũng cần giữ tham chiếu đến số BroadcastReceiver khi bạn gọi unregisterService (onDestroy() là địa điểm tự nhiên), nếu không hệ thống sẽ cảnh báo bạn về việc phát hiện các thiết bị thu phát sóng và tức giận.

+0

Có vẻ như bạn đã đúng, tôi cần sử dụng một Chủ đề trong dịch vụ của tôi để giữ cho nó không bị tắt liên tục. – pcm2a

0

gì về một cái gì đó như thế này

class Thing { 
    interface R { 
     void onReceive(Context c, Intent i); 
    } 

    private BroadcastReceiver receiver; 
    private IntentFilter filter; 
    private boolean isRegistered = false; 

    public Thing(Thing.R r, String... actions) { 
     receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       r.onReceive(context, intent); 
      } 
     }; 
     filter = new IntentFilter(); 
     for (String a : actions) 
      filter.addAction(a); 
    } 

    public void register(Context c) { 
     if (isRegistered) return; 
     c.registerReceiver(receiver, filter); 
     isRegistered = true; 
    } 

    public void unregister(Context c) { 
     if (!isRegistered) return; 
     c.unregisterReceiver(receiver); 
     isRegistered = false; 
    } 
} 

sau đó

Thing t = new Thing((c, i) -> { 
    try { 
     WifiManager mWm = (WifiManager) context 
       .getSystemService(Context.WIFI_SERVICE); 
     ret = mWm.isWifiEnabled(); 
     // DO MORE STUFF HERE 
    } catch (Exception e) { 
    } 
}, WifiManager.WIFI_STATE_CHANGED_ACTION); 

nay gọi t.register như nhiều như bạn thích!

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