[Android] 알람 소스 (.java & .xml)

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

<?xml version="1.0" encoding="utf-8"?>
<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 클래스 등록 반드시 하셔야 합니다.!!


물론 소리가 나는 것을 죽이고 싶으시면  

NotificationManager nm =(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// Cancel Notification
nm.cancel(1234);
finish();

이렇게 통지메니저의 아이디를 이용하여 죽이면 소리가 꺼지겠죠?
 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());

}



작성자의 말 : 이상하게 다른 포스팅은 뎃글이 안달리는데 이 포스팅에만 뎃글이 달리는 것 보면 제가 많이 부족하게 써놔서 그런가 싶습니다. 죄송합니다. 궁금한점은 계속 적어 주시고 혹 문제가 있으시면 보완하여 뎃글로 적어 주시면 참고 하겠습니다.^^


참고 : 알람 소스를 위한 관련 링크를 걸어 두겠습니다.

반응형