세가지 디바이스에서 receiver를 테스트해 보았는데 동작이 제각각입니다.
특별히 하드웨어 가릴 코드도 아닌데... 좀 봐주세요.
A 디바이스 - AVD로 만든 가상 디바이스, 진저브레드
B 디바이스 - VirtualBox로 android-x86 구동, 진저브레드
C 디바이스 - 실 장비, ICS
코드는 아래와 같습니다. 프로젝트는 일부러 분리했어요.
BROnlyTestActivity.java
package com.eta.bronlytest; // import 생략 public class BROnlyTestActivity extends Activity { public static final String ACT_TEST="com.eta.bronly.TEST"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void mOnClick(View v) { Intent intent=new Intent(ACT_TEST); sendBroadcast(intent); } }
BROnly.java
package com.eta.bronly; // import 생략 public class BROnly extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Toast.makeText(context, "broadcast received", Toast.LENGTH_SHORT).show(); } }
BROnly Manifest
// application 태그 부분만 <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <receiver android:name=".BROnly"> <intent-filter> <action android:name="com.eta.bronly.TEST" /> </intent-filter> </receiver> </application>
보시다시피 receiver가 동작하는지 여부만 확인하기 위한 가장 간단한 코드입니다.
그런데 A 디바이스에서는
java.lang.RuntimeException: Unable to start receiver com.eta.bronly.BROnly: java.lang.NullPointerException
에러가 나구요. B 디바이스는 정상 작동, C 디바이스는 receiver를 수신하지 않는지 토스트가 뜨질 않습니다.
원래는 C장비를 타겟으로 외부 전원이 연결/분리될 때의 방송을 받아서 처리하는 app을 만들려고 했는데, receiver만 있는 프로젝트(자동으로 생성되는 activity를 지우고 application 내에 receiver만 있도록 수정)를 만들었더니 B장비에선 되는데 C장비에선 방송을 못 받더군요. 그래서 확인하다보니 위와 같이 제각각인 결과를 얻었습니다.
질문을 요약하면,
1. 위처럼 결과가 다른 이유는 왜 그런 건가요?
2. receiver만 있는 app이 C장비에서 정상적으로 동작하지 않는 이유는 뭘까요.. ㅜㅜ (이게 급함;)