마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

GCM BroadcastReceiver 질문입니다

0 추천
import java.io.IOException;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import com.google.android.gcm.GCMRegistrar;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;
import android.view.View;
import android.view.View.OnClickListener;
public class GCMActivity extends Activity {
 final static String SENDER_ID = "18178958862"; // GCM 프로젝트 생성 시 발급 받은 Project_number
    final static String SERVER_API_KEY = "AIzaSyDW9LITPiRxRi1OOAZjdHLd9PQqn-BYkJ0"; // API_ACCESS 페이지에서 받은 서버 API KEY
    static final Handler mHandler = new Handler();
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        String regId = GCMRegistrar.getRegistrationId(this);
       
        if (regId.equals("")) {
            GCMRegistrar.register(this, SENDER_ID);
        } else {
            Log.v("Main", "Already registered (" + regId + ")");
        }
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 서버 API_KEY 입력
                        Sender sender = new Sender(SERVER_API_KEY);
                        Message message = new Message.Builder()
                                .collapseKey(
                                        String.valueOf(Math.random() % 100 + 1))
                                .delayWhileIdle(true).timeToLive(3)
                                .addData("no", "1").addData("title", "Hello")
                                .addData("msg", "GCM TEST").build();
                        try {
                            // 클라이언트 아이디를 가져온다.
                            String regId = GCMRegistrar
                                    .getRegistrationId(GCMActivity.this);
                            Log.d("GCMIntentService", "send! : " + regId);
                            Result result = sender.send(message, regId, 5);
                            Log.v("GCMIntentService", "result : "
                            + result.getCanonicalRegistrationId());
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
 }

 @Override
    protected void onPause() {
        super.onPause();
        if (!GCMRegistrar.getRegistrationId(this).equals("")) {
            GCMRegistrar.unregister(this);
        }
    }
}import java.io.IOException;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import android.content.BroadcastReceiver;
import com.google.android.gcm.GCMBaseIntentService;

public class GCMIntentService extends GCMBaseIntentService {
    public static String mID = "";
    @Override
    protected void onError(Context context, String errorId) {
        // 기기 등록 실패 및 GCM 관련 오류
        Log.v("GCMIntentService", "onError - " + errorId);
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.v("GCMIntentService", "onMessage");
        final String str = String.format("no: %s \ntitle: %s \nmsg: %s",
                intent.getStringExtra("no"), intent.getStringExtra("title"),
                intent.getStringExtra("msg"));
        GCMActivity.mHandler.post(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), "onMessage - " + str,
                        Toast.LENGTH_LONG).show();
            }
        });

    }

    // 기기 등록 후 호출
    @Override
    protected void onRegistered(Context context, String regId) {
        // 기기 등록 성공
        final String mID = regId;
        GCMActivity.mHandler.post(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),
                        "onRegistered - " + mID, Toast.LENGTH_LONG).show();
            }
        });
        Log.v("GCMIntentService", "onRegistered - " + regId);
    }

    // 기기 등록 해제 후 호출
    @Override
    protected void onUnregistered(Context context, String regId) {
        Log.v("GCMIntentService", "onUnregistered - " + regId);
    }
}
06-08 23:17:08.948: D/(4190): mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Thu Oct 25 08:43:05 KST 2012
06-08 23:17:08.968: D/OpenGLRenderer(4190): Enabling debug mode 0
06-08 23:17:12.518: V/GCMBaseIntentService(4190): Intent service name: GCMIntentService-DynamicSenderIds-1
06-08 23:17:12.518: D/AndroidRuntime(4190): Shutting down VM
06-08 23:17:12.518: W/dalvikvm(4190): threadid=1: thread exiting with uncaught exception (group=0x419342a0)
06-08 23:17:12.523: E/AndroidRuntime(4190): FATAL EXCEPTION: main
06-08 23:17:12.523: E/AndroidRuntime(4190): java.lang.RuntimeException: Unable to instantiate receiver edu.example.gcmanother.GCMIntentService: java.lang.ClassCastException: edu.example.gcmanother.GCMIntentService cannot be cast to android.content.BroadcastReceiver
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2261)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.app.ActivityThread.access$1600(ActivityThread.java:140)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.os.Looper.loop(Looper.java:137)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.app.ActivityThread.main(ActivityThread.java:4921)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at java.lang.reflect.Method.invokeNative(Native Method)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at java.lang.reflect.Method.invoke(Method.java:511)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
06-08 23:17:12.523: E/AndroidRuntime(4190):  at dalvik.system.NativeStart.main(Native Method)
06-08 23:17:12.523: E/AndroidRuntime(4190): Caused by: java.lang.ClassCastException: edu.example.gcmanother.GCMIntentService cannot be cast to android.content.BroadcastReceiver
06-08 23:17:12.523: E/AndroidRuntime(4190):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2256)
06-08 23:17:12.523: E/AndroidRuntime(4190):  ... 10 more
06-08 23:17:23.588: I/Process(4190): Sending signal. PID: 4190 SIG: 9

동작시 이런 에러가 뜹니다. 저기 저 BroadcastReceiver는 어찌써야한다는 말인가요?

코드출처:Frog님 블로그
elsekid (240 포인트) 님이 2013년 6월 8일 질문
elsekid님이 2013년 6월 9일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...