안드로이드 개발시 이런 애러가 나올 경우가 있다.
원인을 찾지 못해서 gcm.jar이 deprecated가 되었다고 해서 모두 google cloud messaging 라이브러리를 사용했는데 해당 에러가 동일하게 발생했다.
06-12 14:44:43.553: E/BroadcastReceiver(27011): java.lang.RuntimeException: BroadcastReceiver trying to return result during a non-ordered broadcast 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.content.BroadcastReceiver.checkSynchronousHint(BroadcastReceiver.java:783) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.content.BroadcastReceiver.setResultCode(BroadcastReceiver.java:549) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at com.kamsung.anvang.gcm.GcmBroadcastReceiver.onReceive(GcmBroadcastReceiver.java:30) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2535) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.app.ActivityThread.access$1600(ActivityThread.java:165) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1402) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.os.Handler.dispatchMessage(Handler.java:99) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.os.Looper.loop(Looper.java:176) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at android.app.ActivityThread.main(ActivityThread.java:5455) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at java.lang.reflect.Method.invokeNative(Native Method) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at java.lang.reflect.Method.invoke(Method.java:525) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 06-12 14:44:43.553: E/BroadcastReceiver(27011): at dalvik.system.NativeStart.main(Native Method)
원인은 삼성 런처를 위한 코드를 넣었을 때 발생했다.
아래와 같은 코드를 사용했을 경우.
Intent badgeIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); badgeIntent.putExtra("badge_count", notiCnt); badgeIntent.putExtra("badge_count_package_name", context.getPackageName()); badgeIntent.putExtra("badge_count_class_name", getLauncherClassName(context)); context.sendBroadcast(badgeIntent);
위의 코드로 뱃지를 업데이트 했을 경우 broadcast 한 인텐트를 지금 개발하는 앱에서 받아서 문제가 생긴다.
이럴때는 해당 인텐트를 예외처리 해서 처리할 수 있다.
아래 코드는 필자가 사용한 코드다.
참고 해서 인텐트를 확인해보자.
인텐트의 key 와 value 는 다를 수 있으니 한번 찍어서 확인해보자
내가 원하는 인텐트가 아닐 경우를 찾아내서 예외처리를 해준다면 에러가 나지 않을 것이다.
@Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); // registration_id가 있는 경우만 receive 한다. boolean foundexceptionKey = false; for (String key : bundle.keySet()) { Object value = bundle.get(key); if (key.equals("CMD") && value.toString().equals("RST_FULL")) foundexceptionKey = true; } if (foundexceptionKey) return; // Explicitly specify that GcmIntentService will handle the intent. ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, intent.setComponent(comp)); setResultCode(Activity.RESULT_OK); }