세가지 디바이스에서 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장비에서 정상적으로 동작하지 않는 이유는 뭘까요.. ㅜㅜ (이게 급함;)



