2010-11-24 6 views
4

Androidでアプリケーションを開発していて、ネストされたクラスのインスタンス化を試みるとAndroidフレームワークがjava.lang.InstantiationExceptionをスローする問題があります。 ここにシナリオがあります。マニフェストファイル内のsendBroadcastが行われたときにネストされたクラス(extends broadcastReceiver)をインスタンス化できません。

public class A extends Activity 
{ 
    public void onCreate(){ 
    ....}; 
    //Class B 
    public class B extends BroadcastReceiver 
    { 
     public void onReceive(...) 
    } 
} 
  • クラス宣言: ....

  • BroadcastReceiverを拡張するネストされたクラスBと

    1. クラスA延びるアクティビティ

    申し訳ありません。非常に多くのタグでコードを適切にインデントする方法を見つけることができませんでした。

    1. サービスからブロードキャスト:すべての上に与えられたもので
    
        Intent updateIntent = new Intent(); 
        updateIntent.setAction("desired_action"); 
        sendBroadcast(accountPropertyUpdateIntent); 
    

    、コードがコンパイルされるが、放送が呼び出された後、デバイス上で実行すると、私は言ってないInstantiationExceptionを取得しますpacakage.A $ Bをインスタンス化することはできません.dalvikは見つかりませんでした。

    この全体のシナリオはAndroid 2.2でも動作しますが、何とかこれは2.1で失敗します。

    私は何が起こっているのか正確にはわかりません。助けが必要です。たぶん何か基本的なものが私には分からない。

    誰でもお手伝いできますか?前もって感謝します。

    +0

    私はあなたがネストされたbroadcastrecieverクラスを持つことができないと確信しています。なぜあなたはこれをやろうとしていますか? – Falmarri

    +0

    一部のブロードキャストイベントでクラスBがクラスAのメンバーに直接アクセスし、それに応じてUIを更新できるように、クラスA内にbroadcastreceiverが必要です。 – Puneet

    答えて

    4

    最後に、シナリオ全体について論理的な結論を得ました。 developer.android.netの<receiver>のドキュメントを読んでいないほど馬鹿だった。 アプリケーションがブロードキャストを取得する方法は2通りあることが明確に述べられています。

    There are two ways to make a broadcast receiver known to the system: 
    One is declare it in the manifest file with this element. 
    The other is to create the receiver dynamically in code and register it with the 
    Context.registerReceiver() method. 
    See the BroadcastReceiver class description for more on dynamically created receivers. 
    

    私は両方の方法を使用しています。 私のシナリオは2.2でも失敗しました。受信者もマニフェストを通して登録されていて、自動的に呼び出されるはずでしたが、何とかしませんでした(これはまだ謎です)。

    マニフェストからすべてのレシーバを削除し、ブロードキャストレシーバの動的登録をそのまま保持していたため、以前のコードと同様に動作します。

    ありがとうございました。 :)

    1

    Nested class documentationは(最後の段落を)言う:

    To instantiate an inner class, you must first instantiate the outer class. 
    Then, create the inner object within the outer object with this syntax: 
    
    OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 
    

    ので、Androidは自動的に内部クラスをインスタンス化することはできません。クラスBをトップレベル(別ファイルB.java)に移動するだけです。

    +0

    これは論理的な説明であるようですが、コードをテストしたほとんどのAndroid 2.2デバイスでこの同じコードが動作する理由についてはまだ混乱しています。クラスAが存在せず、ブロードキャストが行われた場合、例外はスローされず、クラスAが存在する場合、受信者は登録したとおり正しくインスタンス化され、必要なイベントを取得します。これは、コードが実行されているデバイスの場合です。しかし、私がテストした新しいボードでは、クラスAは存在せず、ブロードキャストが作成され、InstantiationExceptionが発生しました。 – Puneet

    +0

    上記のコメントに加えて...クラスAのonCreateで受け取るクラスBを登録しました。放送が行われた場合(例外の場合)には、クラスAは存在しない。理想的には、フレームワークはクラスBをインスタンス化しようとすべきではありませんか?またはそれにブロードキャストを送信しようとする... – Puneet

    関連する問題