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