본문 바로가기

«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

[펌]c2dm 관련 팁 본문

Android/Tip&Tech

[펌]c2dm 관련 팁

행복한 수지아빠 2011. 5. 30. 09:11

C2DM과 Notification 사용시 막히는 부분이 있어서 이렇게 질문 드립니다.

 

01.public class C2dm_BroadcastReceiver extends BroadcastReceiver {          // -------- 1번
02. 
03.NotificationManager mNotiManager;
04.public static String registration_id = null;
05.static String c2dm_name = "";
06.static String c2dm_msg = "";
07. 
08. 
09.public void onReceive(Context context, Intent intent) {
10. 
11.mNotiManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);          // ---------- 2번
12. 
13.if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
14. 
15.handleRegistration(context, intent);
16. 
17. 
18.else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {         // ---------- 3번
19. 
20.c2dm_name = intent.getExtras().getString("name");
21.c2dm_msg = intent.getExtras().getString("msg");
22. 
23.System.out.println("c2dm_msg======>"+c2dm_msg);
24. 
25. 
26.Toast toast = Toast.makeText(context, c2dm_name+"님 으로부터의 메시지\n"+c2dm_msg, Toast.LENGTH_LONG );
27.toast.setGravity( Gravity.TOP | Gravity.CENTER, 0150 );
28.toast.show();
29. 
30.Notification noti = new Notification(R.drawable.btn_notread, "쪽지가 왔어요~!", System.currentTimeMillis());
31. 
32.noti.defaults |= Notification.DEFAULT_SOUND;
33.noti.defaults |= Notification.DEFAULT_VIBRATE;
34. 
35.noti.flags |= Notification.FLAG_AUTO_CANCEL;
36. 
37.mNotiManager.notify(1, noti);
38.}
39.}
40. 
41.private void handleRegistration(Context context, Intent intent) {
42. 
43.registration_id = intent.getStringExtra("registration_id");
44. 
45.System.out.println("registration_id====>"+registration_id);
46. 
47.if (intent.getStringExtra("error") != null) {
48.Log.v("C2DM_REGISTRATION",">>>>>" "Registration failed, should try again later." "<<<<<");
49.else if (intent.getStringExtra("unregistered") != null) {
50.Log.v("C2DM_REGISTRATION",">>>>>" "unregistration done, new messages from the authorized sender will be rejected" "<<<<<");
51.else if (registration_id != null) {
52. 
53.SharedPreferences pref = context.getSharedPreferences("reg_id"0);
54.SharedPreferences.Editor editor = pref.edit();
55. 
56.editor.putString("reg_id", registration_id);
57. 
58.editor.commit();
59. 
60.System.out.println("registration_id complete!!");
61.}
62.}
63. 
64.}

 

 C2DM을 이용해 3번에서 수신후 토스트 메시지는 뜨는데, 이것 대신 위와 같은 방식을 이용해 notification으로 알려주려고 하니까 2번에서 문제가 발생하고.. 1번의 extends BroadcastReceiver를 extends Activity로 바꾸자니 2번의 문제는 해결이 되지만 onReceive를 이용 할 수가 없고..  여기서 어떻게 해야 notification으로 알려줄 수 있을까요??

댓글
2011.05.16 14:11:07
FX마니아

01.if (intent.getAction().equals(
02."com.google.android.c2dm.intent.RECEIVE")) {
03.c2dm_msg = intent.getExtras().getString("msg");
04.Toast toast = Toast.makeText(context, "메시지 도착!\n" + c2dm_msg,
05.Toast.LENGTH_SHORT);
06.toast.setGravity(Gravity.TOP | Gravity.CENTER, 0150);
07.toast.show();
08. 
09.nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
10.PendingIntent pendingIntent = PendingIntent.getActivity(
11.context, 0,new Intent(context, C2dmTest.class), 0);
12.String ticker = c2dm_msg;
13.String title = "test";
14.String text = c2dm_msg;
15. 
16.//화면 켜짐 유무 체크
17.KeyguardManager km = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
18.// Create Notification Object
19.if(GetClassName(context).equals("c2.dm.C2dmTest") && !km.inKeyguardRestrictedInputMode()){}
20.else if(km.inKeyguardRestrictedInputMode()){
21. 
22.PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
23.PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK , "test");
24.wl.acquire();
25.Notification notification = new Notification(R.drawable.icon1,ticker, System.currentTimeMillis());
26.notification.defaults |= (Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
27.notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT ;
28. 
29.notification.setLatestEventInfo(context,title, text, pendingIntent);
30.nm.notify(1234, notification);
31.nm.wait(5000);
32.wl.release();
33. 
34. 
35.}

 

형식으로 전 OnReceive 내에서 사용했습니다.

 

Context만 끌고오면 문제없이 사용할 수 있으실겁니다.

댓글
2011.05.16 15:10:40
아카디언

오~ 빠른 답변!!  덕분에 해결 했네요. 감사합니다 ^^
NOTIFICATION_SERVICE 앞쪽에도 Context를 지정해줘야 하는군요..ㅎ

댓글
2011.05.16 15:17:30
FX마니아

상속받아서 써야겠죠 역시... 후후 도움되었다니 다행입니다!