2011. 1. 12. 13:27ㆍ개발관련기록/Android(인조인간)
.java
import java.util.Calendar;
import java.util.GregorianCalendar;
import android.app.*;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TimePicker.OnTimeChangedListener;
public class Alram extends Activity
implements OnDateChangedListener, OnTimeChangedListener {
/*
* 알람관련 맴버 변수
*/
// 알람 메니저
private AlarmManager mManager;
// 설정 일시
private GregorianCalendar mCalendar;
//일자 설정 클래스
private DatePicker mDate;
//시작 설정 클래스
private TimePicker mTime;
/*
* 통지 관련 맴버 변수
*/
private NotificationManager mNotification;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//통지 매니저를 취득
mNotification = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
//알람 매니저를 취득
mManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//현재 시각을 취득
mCalendar = new GregorianCalendar();
Log.i("HelloAlarmActivity",mCalendar.getTime().toString());
//셋 버튼, 리셋버튼의 리스너를 등록
setContentView(R.layout.alarm);
Button b = (Button)findViewById(R.id.set);
b.setOnClickListener (new View.OnClickListener() {
public void onClick (View v) {
setAlarm();
}
});
b = (Button)findViewById(R.id.reset);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
resetAlarm();
}
});
//일시 설정 클래스로 현재 시각을 설정
mDate = (DatePicker)findViewById(R.id.date_picker);
mDate.init (mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), this);
mTime = (TimePicker)findViewById(R.id.time_picker);
mTime.setCurrentHour(mCalendar.get(Calendar.HOUR_OF_DAY));
mTime.setCurrentMinute(mCalendar.get(Calendar.MINUTE));
mTime.setOnTimeChangedListener(this);
}
//알람의 설정
private void setAlarm() {
mManager.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent());
Log.i("HelloAlarmActivity", mCalendar.getTime().toString());
}
//알람의 해제
private void resetAlarm() {
mManager.cancel(pendingIntent());
}
//알람의 설정 시각에 발생하는 인텐트 작성
private PendingIntent pendingIntent() {
Intent i = new Intent(getApplicationContext(), Alram.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
return pi;
}
//일자 설정 클래스의 상태변화 리스너
public void onDateChanged (DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mCalendar.set (year, monthOfYear, dayOfMonth, mTime.getCurrentHour(), mTime.getCurrentMinute());
Log.i("HelloAlarmActivity", mCalendar.getTime().toString());
}
//시각 설정 클래스의 상태변화 리스너
public void onTimeChanged (TimePicker view, int hourOfDay, int minute) {
mCalendar.set (mDate.getYear(), mDate.getMonth(), mDate.getDayOfMonth(), hourOfDay, minute);
Log.i("HelloAlarmActivity",mCalendar.getTime().toString());
}
}
.XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<!-- Date -->
<DatePicker
android:id="@+id/date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- Time -->
<TimePicker
android:id="@+id/time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- Button -->
<LinearLayout
android:orientation="horizontal"
android:gravity="right"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="set" />
<Button
android:id="@+id/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="reset" />
</LinearLayout>
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
==================================================================================
너무나 기본적인 소스다.
시나리오 :
- 날짜와 시간을 입력후 set 버튼을 눌러 이벤트를 기다린다.
- 참고로, 홈버튼을 눌러 나가거나 back버튼을 눌러 나가도 일정 시간이 되면 이벤트가 발생된다.
- 이벤트는 해당 화면이 갑자기 뜨면서 이벤트가 발생된다.
이제 여기서 벨소리, 진동등 통지매니저를 취득하면서 사용하면 더 다양하게 사용할수 있을 것으로 생각된다.
===================================================================================
20111026 추가 작성
추가로 만드셔야 할 자바 클래스.
AlramReceiver.Java
import android.app.*;
import android.content.*;
import android.graphics.*;
import android.net.*;
import android.os.*;
import android.provider.MediaStore.*;
import android.util.*;
import android.widget.*;
public class AlarmReceiver extends BroadcastReceiver {
private int YOURAPP_NOTIFICATION_ID;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, R.string.app_name, Toast.LENGTH_SHORT).show();
showNotification(context, R.drawable.icon,
"알람!!", "지금 이러고 있을 시간 없다.");
}
private void showNotification(Context context, int statusBarIconID,
String statusBarTextID, String detailedTextID) {
Intent contentIntent = new Intent(context, TestPageWrite.class);
PendingIntent theappIntent =
PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
CharSequence from = "알람";
CharSequence message = "무슨짓을 해야 알람이 꺼질까요?";
Notification notif = new Notification(statusBarIconID, null, System.currentTimeMillis());
notif.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");//ringURI;
notif.flags = Notification.FLAG_INSISTENT;
notif.setLatestEventInfo(context, from, message, theappIntent);
notif.ledARGB = Color.GREEN;
NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(1234, notif);
}
}
설명 :
Intent contentIntent = new Intent(context, TestPageWrite.class);
여기서 "TestPageWrite.class" 이 부분은 보이고 싶은 activity 클래스를 작성하시면 됩니다.
많은 분들이 오류가 나는 부분 :
Manifast 부분에서 activity 클래스 등록 반드시 하셔야 합니다.!!
물론 소리가 나는 것을 죽이고 싶으시면
이렇게 통지메니저의 아이디를 이용하여 죽이면 소리가 꺼지겠죠?
finish()는 엑티비티를 죽이는 역할을 위해 적은 것입니다.
원래 소스 약간 수정 (함수 setAlram() 수정)
//알람의 설정
private void setAlarm() {
if(nowTime >= mCalendar.getTimeInMillis()){
Toast.makeText(Alram.this, "입력한 날짜는 현재 날짜보다 이전입니다.", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(Alram.this, 0, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), 0, sender);
Log.i("HelloAlarmActivity", mCalendar.getTime().toString());
}
작성자의 말 : 이상하게 다른 포스팅은 뎃글이 안달리는데 이 포스팅에만 뎃글이 달리는 것 보면 제가 많이 부족하게 써놔서 그런가 싶습니다. 죄송합니다. 궁금한점은 계속 적어 주시고 혹 문제가 있으시면 보완하여 뎃글로 적어 주시면 참고 하겠습니다.^^
참고 : 알람 소스를 위한 관련 링크를 걸어 두겠습니다.
1. 알람소스위한링크1
2. 알람소스위한링크2
3. http://stackoverflow.com/questions/5916859/how-to-save-alarm-after-app-killing
4. http://pheadra.tistory.com/entry/Alarm
'개발관련기록 > Android(인조인간)' 카테고리의 다른 글
[Android] 물리엔진관련 내용 [펌] (0) | 2011.12.06 |
---|---|
[Android] Sample Source (0) | 2011.12.06 |
[Android]물리 엔진 (0) | 2011.03.17 |
[Android]겔럭시 S USB 인식 드라이브 (3) | 2011.01.13 |
안드로이드 개발 환경 설정 (0) | 2010.12.21 |