티스토리 뷰

날짜가 변경되면 오늘의 일정도 변해야지.....!!

날짜가 바뀌면 앱 위젯의 내용을 갱신시켜야 한다.
주기적으로 intent를 broadcast 할수 있는 AlarmManager 를 사용해보고자 한다.

애뮬레이터의 시간설정이 야속해~

작성된 앱을 실행시켰다. 정해진 시간에 알람이 호출되야 하는데...반응이 없었다....
몇시간의 난(?)투...끝에 알아낸 원인은..크...
애뮬레이터의 시간설정이 현재 시간이 아니었는데 나는 그것을 보지 못하고 계속 현재시간 시준으로 세팅하고 있었던 것이다...ㅠㅠ

알람 등록하기 및 삭제하기

  • 인텐트 설정하기
  • AlarmManager 인스턴스 얻기 및 알람 등록

알람 수신하기

  • 브로드캐스 수신하기

알람 등록하기

onEnabled() 메소드는 첫번째 위젯이 생성될 때만 호출되는 메서드이다. 여기에 알람을 설정해 놓으면 모든 위젯에 적용이 된다.


@Override
public void onEnabled(Context context) {
	Log.d(TAG, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> onEnabled"); 
	// 알람 브로드캐스트 설정하기 : 매일 저녁 12시에 위젯 업데이트 
	PendingIntent pendingIntent_alarm = PendingIntent.getBroadcast(context, 0, new Intent(myManager.ACTION_WIDGET_REFRESH),0);

	dayInfo = myManager.getTodayInfo();
	Calendar calendar = Calendar.getInstance(); 
	calendar.setTimeInMillis(System.currentTimeMillis());
	calendar.set(Calendar.HOUR_OF_DAY, 24);
	calendar.set(Calendar.MINUTE, 0);
	calendar.set(Calendar.SECOND, 0);
	calendar.set(Calendar.MILLISECOND,0);

	AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

	alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent_alarm);

	super.onEnabled(context);
}

알람 삭제하기

onDisabled() 메소드는 마지막 위젯이 삭제될 때 호출된다. 알람이 더이상 필요없기 때문에 여기서 삭제시킨다.

스마트폰의 실행되는 앱을 살펴보면 이전에 위젯을 설치했다 삭제한 앱 중에서 현재 실행한 적도 없고, 데이타 갱신도 필요없는 앱인데 실행 중으로 나오는 경우가 왕왕 있다. 왠지 스케쥴러에 위젯 데이타 갱신을 시켜놓고 삭제를 안시켰다는 의심이 들었었는데 아마도 맞는 것 같다. 위젯을 모두 삭제한 후에도 이곳에서 정리해 주지 않는다면 의미없는 알람을 계속 날릴 것이고 시스템은 필요없는 동작을 계속할 것이다.

@Override
public void onDisabled(Context context) {
	// 알람 브로드캐스트 삭제하기 
	Log.d(TAG, "==Clear Widget Service=="); 
	AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
	alarmManager.cancel(PendingIntent.getBroadcast(context, 0, new Intent(myManager.ACTION_WIDGET_REFRESH),0));

	super.onDisabled(context);
}

알람 수신하기

AppWidgetProvider 는 BroadcastReceiver 를 상속받은 객체이다. 따라서 호출된 브로드캐스트를 onReceive()로 직접받아 처리할 수 있다.

@Override
public void onReceive(Context context, Intent intent) {
	String action = intent.getAction();
	  

	if(action.equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)){


	 AppWidgetManager manager = AppWidgetManager.getInstance(context);
	 this.onUpdate(context, manager, manager.getAppWidgetIds(new ComponentName(context, MyAppWidgetProvider.class)));
	 

	 
    }else{

		super.onReceive(context, intent);
    }

    
}
댓글