작성자 블로그 : 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가 받겠죠?
intent = new Intent(); intent.setAction("org.exam.Alarm_action"); this.sendBroadcast(intent);
4.Receiver에선 서비스를 실행합니다.
Intent mIntent = new Intent(context,AlarmService.class); mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if(!dbHandler.getIsFirst()) new MyThread(context).start();
context.startService(mIntent);
5.서비스에서 AlarmManager를 객체 생성후 배운대로 PendingIntent를 설정합니다..(책보고 하긴 했지만 아직 머하는 놈인지 자세히는..)
AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); Intent mIntent = new Intent(AlarmService.this,BroadAlarmManager.class); mIntent.putExtra("id",1); PendingIntent sender = PendingIntent.getBroadcast(AlarmService.this,0,mIntent,0);
6.이제 문제의 Calendar를 설정합니다..(솔직히 이부분에서 조언을 받았으면 합니다..)
Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); int mHour = calendar.get(Calendar.HOUR); int mHin = calendar.get(Calendar.MINUTE); int mSec = calendar.get(Calendar.HOUR); Log.i("Time","1:"+mHour); Log.i("Time","2:"+mHin); Log.i("Time","3:"+mSec); calendar.add(Calendar.MINUTE, 59-mHin); calendar.add(Calendar.SECOND, 60-mSec); mHour = calendar.get(Calendar.HOUR); mHin = calendar.get(Calendar.MINUTE); mSec = calendar.get(Calendar.HOUR);
대략 위의 소스대로 하면 다음 알람 시간은 예) 6시 00분 07초에서 10초사이에 설정됨
7.이제 AlarmManager으 Set으로 설정합니다.
manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); Toast.makeText(this, "알람등록완료", Toast.LENGTH_SHORT).show();
8.그럼 시간이 지나고 또 지나고 매시간 정각이 되는 순간이 아니라..좀 몇초지나서..ㅋㅋ 소리가 나옵니다..(띵똥 몇시..)
소리 나오는 건 Receiver에서 옵션을 잡아서 재생하게 합니다.
여기선 쓰레드를 이용해서 하긴 했지만 뭐 굳이 안해도 될것 같더군요...^^;
MyThread(Context ctx){ this.mCtx = ctx; calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE); volume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); } public void run(){ /* int hour = calendar.get(Calendar.MINUTE); String sHour = String.valueOf(hour); if(sHour.length() >1) sHour = sHour.substring(1, sHour.length()); Log.i("Receive","hour:"+sHour); */ //int am = calendar.get(Calendar.AM); int tHour = calendar.get(Calendar.HOUR); Log.i("Time","thread hour : "+tHour); //if(am==0) //tHour--; MediaPlayer mp = MediaPlayer.create(mCtx, getHourVal(tHour));
mp.setVolume(volume, volume); mp.start(); }
그럼 여기서 생기는 의문은 왜 Activity에서 바로 알람을 실행안하고 이렇게 약간 복잡하게 할까..
그건 부팅후에도 실행할려고 하기 때문입니다.
인텐트 필터를 적용해 액션 및 부팅 후 Broad도 잡게끔 되어있습니다.
서비스 등록및 filter 적용한 부분입니다.
<service android:name="AlarmService"/> <receiver android:name=".BroadAlarmManager"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="org.exam.Alarm_action" /> </intent-filter> </receiver>
이상으로 간략적인 흐름은 끝냈습니다.
적다보니 상당히 간단하지만....하지만..힘들지만 재미있네요^^
풀소스는 여전히 밑에 첨부되어 있으니 보고 마구 지적해주세요. 지적은 대환영입니다..^^
여담이지만 이 어플은 항상 요양원에 계시는 아버지께서 갤럭시를 사드렸는데 시간알리미가 없어서 불편하다가 해서 기존에 있는 걸 까는 것 보다 자식이 만든 걸 깔아 드리게 되었습니다. 지금 만족하시네요^^
그럼 다들 수고하세요.
저도 이제서야 시작하볼려고 하는데 많은 도움이 되겠네요.
이넘에 안드로이드 개발이라는것이 테크닉도 중요하지만
과정을 모르는 왕초보로서는 이러한 경험들이 참 중요하네요....