작성자 블로그 : http://javaexpert.tistory.com
작성자 메일주소 : bear2u@naver.com


저번 발로 만든 어플 첫번째인 그림메모에 이어 두번째 어플을 만들긴 했습니다.

너무 소스가 부끄러워 그냥 제 블로그에다 넣을려고 했으나 저랑 비슷한 왕초보분들이 상당히 많이 계신것 같아서 또 용기있게 올려봅니다.


 

개략 설명============================================================================
일반 핸드폰에 있는 매시간 알림
서비스입니다.

기본 UI는 한장이며(솔직히 디자인도 어려운 안드로이드임..==;)
alarm1.png
alarm2.png

소스또한 그리 어렵지는
않습니다..하지만 이걸 구현하기 위한 저의 개발시간은 또 일주일..^^;

그리고 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);

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>


이상으로 간략적인 흐름은 끝냈습니다.

적다보니 상당히 간단하지만....하지만..힘들지만 재미있네요^^

풀소스는 여전히 밑에 첨부되어 있으니 보고 마구 지적해주세요. 지적은 대환영입니다..^^

여담이지만 이 어플은 항상 요양원에 계시는 아버지께서 갤럭시를 사드렸는데 시간알리미가 없어서 불편하다가 해서 기존에 있는 걸 까는 것 보다 자식이 만든 걸 깔아 드리게 되었습니다. 지금 만족하시네요^^

그럼 다들 수고하세요.

+ Recent posts