오늘도 공부
(왕초보시리즈2)매시간 알리미 본문
작성자 블로그 : http://javaexpert.tistory.com
작성자 메일주소 : bear2u@naver.com
저번 발로 만든 어플 첫번째인 그림메모에 이어 두번째 어플을 만들긴 했습니다.
너무 소스가 부끄러워 그냥 제 블로그에다 넣을려고 했으나 저랑 비슷한 왕초보분들이 상당히 많이 계신것 같아서 또 용기있게 올려봅니다.
개략 설명============================================================================
일반 핸드폰에 있는 매시간 알림
서비스입니다.
기본 UI는 한장이며(솔직히 디자인도 어려운 안드로이드임..==;)


소스또한 그리 어렵지는
않습니다..하지만 이걸 구현하기 위한 저의 개발시간은 또 일주일..^^;
그리고 AlarmManager 의 setRepeating도
있는 데 Interval로 주기적으로 하는 건데 이상하게 하다 꼬여
서 그냥 주기적으로 Set하면 다시 Set하는 방식으로
했는데..참 난감합니다..^^;;
학습내용
1.broadreceive 기본적인 사용방법 숙지
2.Service 기본
구현방법 숙지
3.인텐트 필터 공부
4.알람메니저 기본 구현방법 숙지
5.Preference 사용방법 숙지..(이것도 하다
BroadReceive에서 받아올줄 몰라서 DB로 바꿔서 이 소스에선 안씀..^^;;
아무튼 간단한 거라도 만드니 상당한 공부가
되는 건 확실하네요^^
그럼 간략하게 소스 설명해드리겠습니다.
하지만 먼저..버그가 좀 있습니다.
1.알람시간이 정확하게 정해지지가 않습니다.
예)5시에 올려야 하는 데 5시 10초정도에 울린다던가..그런경우..도저히 못 잡겠음..T.T
...아시는 분 댓글 부탁..
2.BroadReceive나 Service에서 preference에 접근할려면 어떻게 해야 하는 지 모르겠네요
(아시는 분 댓글 부탁드립니다)
소스는 다음과 같습니다..
대략적인 프로세스 흐름은
1.엑티비티를 실행하면 위와 같은 한장의 UI가 나옵니다.
2. 그럼 실행 클릭합니다.
3.인텐트 액션명을 지정해서 Broad합니다.그럼 Receiver가 받겠죠?
1.intent = new Intent();2.intent.setAction("org.exam.Alarm_action");3.this.sendBroadcast(intent);4.Receiver에선 서비스를 실행합니다.
1.Intent mIntent = new Intent(context,AlarmService.class); 2. mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);3. if(!dbHandler.getIsFirst())4. new MyThread(context).start();1.context.startService(mIntent);1. 5.서비스에서 AlarmManager를 객체 생성후 배운대로 PendingIntent를 설정합니다..(책보고 하긴 했지만 아직 머하는 놈인지 자세히는..)
1.AlarmManager manager =2. (AlarmManager)getSystemService(Context.ALARM_SERVICE);3. 4. Intent mIntent = new Intent(AlarmService.this,BroadAlarmManager.class);5. mIntent.putExtra("id",1);6. PendingIntent sender = PendingIntent.getBroadcast(AlarmService.this,0,mIntent,0);6.이제 문제의 Calendar를 설정합니다..(솔직히 이부분에서 조언을 받았으면 합니다..)
01.Calendar calendar = Calendar.getInstance();02.calendar.setTimeInMillis(System.currentTimeMillis());03. 04.int mHour = calendar.get(Calendar.HOUR);05.int mHin = calendar.get(Calendar.MINUTE);06.int mSec = calendar.get(Calendar.HOUR);07. 08.Log.i("Time","1:"+mHour);09.Log.i("Time","2:"+mHin);10.Log.i("Time","3:"+mSec);11. 12.calendar.add(Calendar.MINUTE, 59-mHin);13.calendar.add(Calendar.SECOND, 60-mSec);14. 15.mHour = calendar.get(Calendar.HOUR);16.mHin = calendar.get(Calendar.MINUTE);17.mSec = calendar.get(Calendar.HOUR);대략 위의 소스대로 하면 다음 알람 시간은 예) 6시 00분 07초에서 10초사이에 설정됨
7.이제 AlarmManager으 Set으로 설정합니다.
1.manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);2. 3.Toast.makeText(this, "알람등록완료", Toast.LENGTH_SHORT).show();8.그럼 시간이 지나고 또 지나고 매시간 정각이 되는 순간이 아니라..좀 몇초지나서..ㅋㅋ 소리가 나옵니다..(띵똥 몇시..)
소리 나오는 건 Receiver에서 옵션을 잡아서 재생하게 합니다.
여기선 쓰레드를 이용해서 하긴 했지만 뭐 굳이 안해도 될것 같더군요...^^;
01.MyThread(Context ctx){02. this.mCtx = ctx;03. calendar = Calendar.getInstance();04. calendar.setTimeInMillis(System.currentTimeMillis());05. AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);06. volume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);07. }08. public void run(){09. 10. 11. /*12. int hour = calendar.get(Calendar.MINUTE);13. 14. String sHour = String.valueOf(hour);15. 16. if(sHour.length() >1)17. sHour = sHour.substring(1, sHour.length());18. 19. Log.i("Receive","hour:"+sHour);20. */21. //int am = calendar.get(Calendar.AM);22. 23. int tHour = calendar.get(Calendar.HOUR);24. Log.i("Time","thread hour : "+tHour);25. //if(am==0)26. //tHour--;27. MediaPlayer mp = MediaPlayer.create(mCtx, getHourVal(tHour));1.mp.setVolume(volume, volume);2. mp.start();3. 4. 5.}
그럼 여기서 생기는 의문은 왜 Activity에서 바로 알람을 실행안하고 이렇게 약간 복잡하게 할까..
그건 부팅후에도 실행할려고 하기 때문입니다.
인텐트 필터를 적용해 액션 및 부팅 후 Broad도 잡게끔 되어있습니다.
서비스 등록및 filter 적용한 부분입니다.
1.<service android:name="AlarmService"/>2.<receiver android:name=".BroadAlarmManager">3. <intent-filter>4. <action android:name="android.intent.action.BOOT_COMPLETED" />5. <action android:name="org.exam.Alarm_action" />6. 7. </intent-filter>8.</receiver>
이상으로 간략적인 흐름은 끝냈습니다.
적다보니 상당히 간단하지만....하지만..힘들지만 재미있네요^^
풀소스는 여전히 밑에 첨부되어 있으니 보고 마구 지적해주세요. 지적은 대환영입니다..^^
여담이지만 이 어플은 항상 요양원에 계시는 아버지께서 갤럭시를 사드렸는데 시간알리미가 없어서 불편하다가 해서 기존에 있는 걸 까는 것 보다 자식이 만든 걸 깔아 드리게 되었습니다. 지금 만족하시네요^^
그럼 다들 수고하세요.
'직접만든어플모음' 카테고리의 다른 글
| UDP 에코 서비랑 클라이언트 (0) | 2011.01.02 |
|---|---|
| [왕초보팁]서비스연결후 현재 보여지고 있는 엑티비티에 값 넘겨줄때 (5) | 2010.12.08 |
| [왕초보시리즈3]간단한 탐색기 (14) | 2010.12.01 |
| (왕초보시리즈1)그림메모어플 (4) | 2010.11.29 |
| [안드로이드]아주 간단한 로그인화면 구현하기 (1) | 2010.11.03 |
