2011-01-31 4 views
12

Activity 클래스의 내부 클래스로 정의 된 경우 BroadcastReceiver을 사용할 수 없다는 것을 알고 있습니다. 하지만 왜 그런지 궁금합니다. 시스템이 수신기 인스턴스를 인스턴스화하기 위해 큰 Activity 개체를 인스턴스화해야하기 때문입니까?내부 클래스로 BroadcastReceiver

답변

26

... 시스템에서 수신자 인스턴스를 설치하기 위해 많은 액티비티 객체를 인스턴스화해야하기 때문에?

다른 정적 인 내부 클래스와 마찬가지로. (정적이 아닌) 내부 클래스의 인스턴스를 생성하기 전에 외부 클래스의 인스턴스를 어딘가에서 가져와야합니다 (예 : 인스턴스화 또는 다른 메커니즘으로).

시스템에 의해 자동으로 인스턴스화 될 매니페스트 파일의 인 텐트에서 호출되는 글로벌 브로드 캐스트 수신기에는 브로드 캐스트 리시버 비 정적 내부 클래스의 인스턴스를 만드는 데 사용할 외부 인스턴스가 없습니다. 이것은 외부 클래스의 Activity와 무관합니다.

그러나 액티비티로 작업 할 때 리시버를 사용하는 경우 액티비티에서 직접 브로드 캐스트 리시버를 인스턴스화 할 수 있습니다 (액티비티 콜백 중 하나는 작업 할 외부 클래스의 인스턴스가있는 반면 : this) 다음과 같은 적절한 그 등록을 취소/등록 : 나는 온라인 몇 가지 예에서 보았 듯이 난 당신이 (또한 제안으로 내부 클래스를 사용하는 것을 시도했다

public class MyActivity extends Activity { 

    private BroadcastReceiver myBroadcastReceiver = 
     new BroadcastReceiver() { 
      @Override 
      public void onReceive(...) { 
       ... 
      } 
     }); 

    ... 

    public void onResume() { 
     super.onResume(); 
     .... 
     registerReceiver(myBroadcastReceiver, intentFilter); 
    } 

    public void onPause() { 
     super.onPause(); 
     ... 
     unregisterReceiver(myBroadcastReceiver); 
    } 
    ... 
} 
+0

) : https://gist.github.com/daviddoria/80c9c5dc98913b54bf00하지만 장치를 회전해도 onReceive가 호출되지 않습니다. 어떤 제안? –

+3

bert는 외부 클래스 객체를 보유하여 메모리 누수를 초래합니까? –

관련 문제