2011-01-31 19 views
12

私はBroadcastReceiverがActivityの内部クラスとして定義されている場合は使用できないことを知っています。しかし、私はなぜだろうか?それはシステムが受信者インスタンスをインスタンス化するために大きなActivityオブジェクトをインスタンス化する必要があるからですか?内部クラスとしてのBroadcastReceiver

答えて

26

...システムは受信者インスタンスをインスタント化するために大きなアクティビティオブジェクトをインスタンス化する必要があるためですか?

他の非静的内部クラスと同様です。 (静的でない)内部クラスのインスタンスを作成する前に、外部クラスのインスタンスをどこかから取得しなければなりません(インスタンス化やその他のメカニズムによって)。

システムによって自動的にインスタンス化されるマニフェストファイルのインテントから呼び出されるグローバルブロードキャストレシーバは、ブロードキャストレシーバの非スタティック内部クラスのインスタンスを作成するために使用する外部インスタンスを持っていません。これは外部クラスとは無関係ですが、Activityかどうかは関係ありません。

ただし、アクティビティの作業の一部として受信者を使用している場合は、アクティビティで自分自身でブロードキャスト受信者をインスタンス化できます(アクティビティコールバックの1つで、外部クラスのインスタンス: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は、これは外部クラスオブジェクトを保持することによって任意のメモリリークにつながるのですか? –

関連する問題