0

I send Broadcast intent with enum ,then onReceiver the action

 Intent intent = new Intent("com.coagent.intent.action.test")
 intent.putExtra("Key_state", KeyState.NONE);
 MainActivity.this.sendBroadcast(intent);

enum as follow:

 public static enum KeyState {
    NONE,
    DOWN,
    UP
}

then other app onReceive the Broadcast,handler the intent

  String EXTRA_KEY_STATE="Key_state";
  Serializable keyState = intent.getSerializableExtra(EXTRA_KEY_STATE);
    String ks = ((Enum) keyState).toString();
    LogUtils.i(TAG, "Wjc handerChangAnAction: ks=" + ks);
    if (null != ks && !ks.equals("NONE")) {
        return;
    }

but onReceive ation it immediately crashes with

FATAL EXCEPTION: main
Process: com.wjc.wecarnews, PID: 25775
java.lang.RuntimeException: Unable to start receiver 
com.wjc.wecarnews.system.PlayReceiver: java.lang.RuntimeException: 
Parcelable encounteredClassNotFoundException reading a Serializable object 
(name = com.rhr.wjc.demo.MainActivity$KeyState)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2414)
at android.app.ActivityThread.access$1700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:805)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
at dalvik.system.NativeStart.main(Native Method)
Alice
  • 79
  • 2
  • 10

1 Answers1

-1

It's not recommended to pass Enum values through Intent. see explanation here

Alternatively, you can do the following:

When you are sending Intent:

 Intent intent = new Intent("com.coagent.intent.action.test")
 intent.putExtra("Key_state", KeyState.NONE.ordinal());
 MainActivity.this.sendBroadcast(intent);

When you are receiving Intent:

int ordinal = intent.getIntExtra("Key_state",-1);
String ks = KeyState.values()[ordinal].toString();
LogUtils.i(TAG, "Wjc handerChangAnAction: ks=" + ks);
if (null != ks && !ks.equals("NONE")) {
   return;
}

P.S. using Enums not recommended in android at all read this article

Zuluft
  • 129
  • 1
  • 5