달력

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
반응형

안드로이드 - Alarm Controller, PendingIntent

원본출처:http://dotndotandroid.blogspot.kr/2011_05_01_archive.html

▦ AlarmController
AlarmController Class와 매치되는 XML은 alarm_controller.xml (AlarmController.java)
        setContentView(R.layout.alarm_controller);

button Listener 설정 (AlarmController .java)
        Button button = (Button)findViewById(R.id.one_shot);
        button.setOnClickListener(mOneShotListener);
        button = (Button)findViewById(R.id.start_repeating);
        button.setOnClickListener(mStartRepeatingListener);
        button = (Button)findViewById(R.id.stop_repeating);
        button.setOnClickListener(mStopRepeatingListener);

oen short alarm button 을 클릭하면 한번만 30초 후 알람을 호출 한다. (AlarmController .java)
누르자 마자 "one-shot alarm will go off ~~~ "토스트 메시지 나온고, 30초 뒤에 "the one-shot alarm has gone off" 토스트 메시지가 나오게 된다.

    private OnClickListener mOneShotListener = new OnClickListener() {
        public void onClick(View v) {

// 알람이 동작할때, BroadcastReceiver로 인텐트를 브로트 캐스트 하길 원한다.
// 여기서 우리는 인텐트를 만든다 명시적인 클레스 이름으로 우리가 가지고 있는
// Receiver(AndroidManifest.xml 안에 공용으로 존재하는)를 설명하고 호출되면,
// IntentSender는 브로드캐스트처럼 인텐트가 실행된다.
            Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
                    0, intent, 0);

            // 지금으로부터 30초 뒤에 알람이 켜지길 원한다.
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.SECOND, 30);

            // 알람 일정
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

            // 우리가 한 일에 대해 사용자에게 알려준다.
            if (mToast != null) {
                mToast.cancel();
            }
            mToast = Toast.makeText(AlarmController.this, R.string.one_shot_scheduled,
                    Toast.LENGTH_LONG);
            mToast.show();
        }
    };

PendingIntent (위임된, 보류된? 인텐트)커뮤니케이션에는 메세지(Intent), 송신자(startActivity, startService 호출), 수신자(Intent filter 가지고 있음) 라는 3가지 기본 요소가 있다.
PendingIntent는 인텐트를 전송하고자 하는 '송신자'가 인텐트를 생성한 후, 인텐트를 나중에 대신 전달 하고자 할때 사용
예) 친구에게 내 카드를 주며, 돈을 대신 찾아 달라는 것. 카드 악용을 맞기 위해 권한 설정

  ※ IntentSender는 PendingIntent와 유사하며, 권한 관리 설정을 할수 없음. 사용시 PendingIntent 생성뒤 getIntentSender() 호출하여야 함.
참고 : http://blog.naver.com/huewu?Redirect=Log&logNo=110084228131

단순히 activity를 상속 받는 것이 아닌, Broadcast와 같이 activity를 상속받지 않은 class의 경우, startActivity(intent)를 사용하지 못하는데, 이때 PendingIntent를 사용 할수 있다.

예제) pi를 이용하여 클래스이름.class를 호출한다.
Intent i = new Intent( mContext, 보낼클래스이름.class );
PendingIntent pi =  
PendingIntent.getActivity(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT);  
   try {
    Toast.makeText(mContext, str, 0).show();
    pi.send();
  } catch (CanceledException e) {
            e.printStackTrace();
  }
참고 : http://www.cyworld.com/bluekirao_Ov/3218155
int FLAG_CANCEL_CURRENT 이전에 생성한 PendingIntent 는 취소하고, 새롭게 하나를 만듭니다. (친구에게 예전에 빌려준 카드를 정지 시키고 새롭게 하나 신청합니다.)
int FLAG_NO_CREATE 현재 생성된 PendingIntent 를 반환 합니다. (친구 보고 내가 빌려준 카드를 당장 가져와 보라고 요청합니다. 이 후에, 해당 카드를 회수 할 수도 있습니다.)
int FLAG_ONE_SHOT 이 플래그를 이용해 생성된 PendingIntent 는 단 한번 밖에 사용될 수 없습니다. (일회용 카드)
int FLAG_UPDATE_CURRENT 만일 이미 생성된 PendingIntent 가 존재 한다면, 해당 Intent 의 내용을 변경합니다. (친구에게 전화해서, 인출할 돈의 액수를 다시 알려줍니다.)
PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags)
브로드캐스트 실행할 PendingIntent를 반환한다. Context.sendBroadcast() 호출하는것과 같다.
매개변수
  context : 브로드 캐스트 실행할 PendingIntent의 Context
  requestCode : sender에게 요청 코드(현재 사용되지 않음)
  intent : 브로드캐스트 할 Intent
  flags :  FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT 또는 Intent.fillIn()에 의해 지원되는       다른 flag들. 실제 전달될때 제공되는 Intent의 어떤 불특정 부분을 제어할수 있다.반환값 : 주어진 매개변수와 일치하는 PendingIntent를 새로 생성하거나 존재할때 반환. FLAG_NO_CREATE 가 제공될경우에만 null을 반환할수 있다.
Start Repeating Alarm button  클릭하면 반복적으로 알람을 호출하게 된다.(
AlarmController .java)
    private OnClickListener mStartRepeatingListener = new OnClickListener() {
        public void onClick(View v) {
            // 위와는 달리 IntentSender 자체를 여러번 전송할 수 있도록 설정한다.
            Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
                    0, intent, 0);

            long firstTime = SystemClock.elapsedRealtime();
            firstTime += 15*1000;

            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                            firstTime, 15*1000, sender);

            if (mToast != null) {
                mToast.cancel();
            }
            mToast = Toast.makeText(AlarmController.this, R.string.repeating_scheduled,
                    Toast.LENGTH_LONG);
            mToast.show();
        }
    };

Stop Repeating Alarm button  클릭하면 반복적으로 알람을 정지하게 된다.(AlarmController .java)
    private OnClickListener mStopRepeatingListener = new OnClickListener() {
        public void onClick(View v) {
            // Create the same intent, and thus a matching IntentSender, for
            // the one that was scheduled.
            Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
                    0, intent, 0);
           
            // And cancel the alarm.
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.cancel(sender);

            // Tell the user about what we did.
            if (mToast != null) {
                mToast.cancel();
            }
            mToast = Toast.makeText(AlarmController.this, R.string.repeating_unscheduled,
                    Toast.LENGTH_LONG);
            mToast.show();
        }
    };

AlarmManager일정 간격으로 스케쥴링 하고 싶을때 사용하는 서비스 (스레드로도 구현 가능하나 데드락 고민필요)
서비스 이므로, 항상 활성화 시키며, 어플리케이션 종료나 비활성화시 해제해주지 않으면 계속 뜬다.

사용방법
1. 명시적 인텐트 설정
  Intent intent = new Intent( MyClass.this, AlarmReceiver.class);
2. 브로드 캐스트 송신자 설정
  PendingIntent sender = PendingIntent.getBroadcast( MyClass.this, 0, intent, 0);
3. 시간 설정
  long firstTime = System.currentTimeMillis();
4. 서비스 객체 얻기
  AlarmManager alarm = (AlarmManager) Context.getSystemService( Context.ALARM_SERVICE );
5. 알람등록(반복)
  alarm.setRepeating( AlarmManager.RTC_WAKEUP, firstTime, 10000, sender);

수신 하기 : 사용하기 전에 Receiver를 등록 해야 한다.
ex) <application android ~~~~ >
         <receiver android:name="AlarmReceiver" android:process=":remote" />

1. BroadcastReceiver을 상속한 클래스 구성
  public class AlarmReceiver extends BroadcastReceiver {
   ...
  }

2. onReceive 오버라이딩 (실제 동작)
  public void onReceive( Context context, Intent intent) {
   ...
  }

참고 : http://blog.daum.net/hopefullife/87

1.스레드를 사용하여 특정 시간 후 작업 처리 방법
핸들러에 스레드 연결,

예제) 10초 후 일 처리
private Handler mHandler;
mHandler.postDelayed( new Runnable() {
   public void run() {
     ...
   }
}, 1000);

2. 다른 스레드에서 UI관련 함수 실행을 원할 경우
UI와 관련된 함수는 대부분 UI스레드에서만 호출 될 수 있다.
  view.post(Runnable action)
  : view에서도 편리함을 위해 메시지를 post 해주는 함수 존재

참고 : http://blog.naver.com/pjsin865?Redirect=Log&logNo=120066422409
728x90
반응형
:
Posted by mapagilove