달력

4

« 2024/4 »

  • 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
728x90
반응형

안드로이드 - 매시간 알리미

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

  •  
  • AlarmExamFinal.zip

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

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


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

    기본 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);
     
    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도 잡게끔 되어있습니다.

     

    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>


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

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

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

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

    그럼 다들 수고하세요.

    728x90
    반응형
    :
    Posted by mapagilove