올해는 머신러닝이다.
(왕초보시리즈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)그림메모어플 (3) | 2010.11.29 |
[안드로이드]아주 간단한 로그인화면 구현하기 (1) | 2010.11.03 |