2017-06-13 6 views
2

なぜこの作品:サブクラスの意向

sendBroadcast(MyUtil.configMyIntent(
         new Intent(), 
         ActionType.DATE, 
         new Date().toString())); 

と:

public static Intent configMyIntent(Intent intent, ActionType actionType, String content){ 

     intent.setAction("myCustomBroadcastIntentAction"); 
     intent.putExtra("actionType",actiontype); 
     intent.putExtra("content", content); 
     return intent; 
    } 

しかし、サブクラス使用している場合:で

CustomIntent intent = new CustomIntent(ActionType.DATE, new Date().toString()); 
sendBroadcast(intent); 

public class CustomIntent extends Intent { 

    public CustomIntent(ActionType actionType, String content) { 
    super(); 
    this.setAction("myCustomBroadcastIntentAction"); 
    this.putExtra("actionType",actionType); 
    this.putExtra("content", content); 
    } 
} 

追加情報はインテントに追加されず、BroadcastReceiverで受信するとnullになりますか?

答えて

0

エキストラが意図

に追加されていないあなたの子クラスは、私はあなたのコードで問題を正確に指摘していないParcelable

+2

理由を教えてください。 –

1

を実装する必要があります。しかし、私はおそらくActionType(私はenumと推測している)が調査対象の領域だと考えています。 ActionTypeはシリアライズ可能である必要がありますか?

いずれにしても、このコードは私には役に立ちます。多分それは便利です:

public class MainActivity extends AppCompatActivity { 

    BroadcastReceiver myReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.v("MyBroadcastReceiver", "action type:" + intent.getSerializableExtra("actionType") + 
        " myExtra:" + intent.getStringExtra("myExtra")); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, new IntentFilter("myAction")); 

     Intent standardIntent = new Intent("myAction"); 
     standardIntent.putExtra("actionType", ActionType.DATE); 
     standardIntent.putExtra("myExtra", "standard value"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(standardIntent); 

     Intent customIntent = new CustomIntent(ActionType.DATE, "custom value"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(customIntent); 
    } 

    private static class CustomIntent extends Intent { 
     CustomIntent(ActionType actionType, String val) { 
      super(); 
      this.setAction("myAction"); 
      this.putExtra("actionType", actionType); 
      this.putExtra("myExtra", val); 
     } 
    } 

    private enum ActionType implements Serializable { 
     DATE 
    } 

} 

これはログ出力されます。

V/MyBroadcastReceiver:アクションタイプ:DATEのmyExtra:標準値

V/MyBroadcastReceiver:アクションタイプ:DATEのmyExtra:カスタム値

+0

ええ、面白いです。唯一の違いは、CustomIntentクラスが静的であることです。 Btw、列挙型を直列化可能にする必要はなく、列挙型は直列化可能です。 –

+0

ああ。シリアライズ可能についての良い点。私の間違い。それは問題ではありません。 –

+0

CustomIntentクラスを非静的にすると、まだ私のために動作します。 LocalBroadcastManagerを使用しない場合でも動作します。 –

関連する問題