2011-01-31 23 views
12

Sé que BroadcastReceiver no se puede usar si se define como clase interna de la actividad. Pero me pregunto por qué? ¿Es porque el sistema tendría que instanciar un objeto grande Activity para simplemente haber instanciado una instancia de receptor?BroadcastReceiver como clase interna

Respuesta

26

... porque el sistema tendría que instanciar un objeto Activity grande para simplemente haber instalado una instancia recevier?

Yup, al igual que cualquier otra clase interna no estática. Tiene que obtener una instancia de la clase externa desde algún lugar (por ejemplo, instanciando o mediante algún otro mecanismo) antes de que pueda crear instancias de la clase interna (no estática).

Los receptores de difusión global que se invocan desde intenciones en el archivo de manifiesto que el sistema debería crear de forma automática no tienen esa instancia externa para crear una instancia de la clase interna no estática del receptor de difusión. Esto es independiente de lo que es la clase externa, Actividad o no.

Sin embargo, si está utilizando un receptor como parte de una actividad, puede crear instancias manualmente de un receptor de difusión en la actividad (mientras tiene una de las devoluciones de actividad, tiene una instancia de la clase externa para trabajar con : this) y luego registrar/anular el registro de la forma apropiada:

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

he tratado de utilizar una clase interna como usted sugiere (y también como vi en algunos ejemplos en línea): https://gist.github.com/daviddoria/80c9c5dc98913b54bf00 pero no se llama aRecepción cuando giro mi dispositivo. ¿Alguna sugerencia? –

+3

bert ¿Esto conduce a cualquier pérdida de memoria al mantener el objeto de la clase externa? –