본문 바로가기
Study/Android

Android Alarm manager (알람매니저)를 이용한 디지털 시계위젯

by Answer Choi 2015. 2. 11.
반응형


 

먼저 위젯을 하나 만듭니다.

 

위젯 만드는 것은  안드로이드 개발자페이지  나 이전글에서 참고 할 수 있습니다.

 

그 다음 시계를 만들기 위해 레이아웃 파일로 들어가면, Digital Clock과 Analog Clock이 보입니다.

 

이것을 추가하면 쉽게 시계를 추가 할 수 있다는 생각이...들지만

 

실행해보면 아래와 같은 화면이 보입니다.

 

아날로그 시계의 경우 띄워지나 디지털 시계의 경우 아래의 화면이 보이는 데요..

 

 

 

 

안드로이드 개발자페이지를 보다보면 그 이유를 알 수 있습니다.

 

 

A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:

And the following widget classes:

결론적으로 디지털 시계는 지원을 안한다는 군요..

 

지원하는건 위의 목록만...

 

그럼 수동으로 만들어 줘야 합니다.

 

 

 

 

Step 1. 일단 textview를 하나 만듭니다.

 

 

widget.xml

  1.  <TextView

  2.                     android:id="@+id/widgetclock"

  3.                     android:layout_width="184dp"

  4.                     android:layout_height="71dp"

  5.                     android:gravity="center"

  6.                     android:textColor="#ffffffff"

  7.                     android:text="12:12"

  8.                     android:textSize="60dp"

  9.                     android:textStyle="bold" />

나머지는 자신이 원하는 세팅으로 해주면 되고요, 중요한건 'id'

 

'id'를 넣어줘야 나중에 시간을 띄우겠죠?

 

 

 

Step 2. 알람매니저 등록하기

 

widget.java

 

  1. @Override

  2.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,

  3.             int[] appWidgetIds) {

  4.        

  5.         super.onUpdate(context, appWidgetManager, appWidgetIds);

  6.         setTime(context);

  7.         ...

일단 위젯이 띄워지고나면 첫 위젯은 onEnable->onUpdate 메소드가 실행됩니다.

(두번째 위젯부턴 바로 onUpdate)

 

그렇기 때문에 onUpdate에서 등록을 하면 될 것 같습니다.

 

내용이 좀 길어지니 함수를 만들어서 밖으로 빼보겠습니다.

 

  1.     public void setTime(Context context){

  2.         PendingIntent service = null;

  3.         final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

  4.         final Intent si = new Intent(context, alarmService.class);

  5.         if (service == null)

  6.         {

  7.             service = PendingIntent.getService(context, 0, si, PendingIntent.FLAG_CANCEL_CURRENT);

  8.         }

  9.         Log.d("timeService""start");

  10.         m.setRepeating(AlarmManager.RTCSystem.currentTimeMillis(),1000,service);

  11.     }

이게 등록하는 부분인데, 여기서 보내질 서비스명과 얼마의 주기로 반복으로 보낼건지 설정을 하게 됩니다.

 

하이라이트 되어있는 부분이 반복할 부분인데, 1초(1000msec)로 설정하는게 시계로 쓰기에 좋겠죠?

 

AlarmManager.RTC는 옵션이 몇개 있습니다.(폰이 시작된 시간부터 할건지, 리얼타임으로 할건지, 화면이 꺼져도할건지 등등..)

 

옵션은 개발문서 를 참고하세요.

 

 

Step 3. 이제 서비스 클래스를 만들어 볼까요.

 

service.java

 

  1.     @Override

  2.     public int onStartCommand(Intent intent, int flags, int startId)

  3.     {

  4.         update();

  5.  

  6.         return super.onStartCommand(intent, flags, startId);

  7.     }

파일을 하나만들고, service를 상속받게 만듭니다.

 

그리고 마우스 오른쪽 버튼->source->override 에서 'onStartCommand' 메소드를 추가하세요.

 

'onStartCommand'메소드는 서비스가 시작될 때 시작되는 메소드 입니다.

 

그럼 이곳에서 시계를 어떻게 세팅할지를 넣어주면 되는데, 역시 내용이 길어지니 함수로 뺍니다.

 

 

  1.     private void update()

  2.     {

  3.             String time = getTime();

  4.         AppWidgetManager manager = AppWidgetManager.getInstance(this);

  5.         ComponentName weatherwidget = new ComponentName(this, WeatherWidget.class);

  6.         int[]ids = manager.getAppWidgetIds(weatherwidget);

  7.         final int N = ids.length;

  8.         for (int i = 0; i < N; i++){

  9.             int awID = ids[i];

  10.             RemoteViews views = new RemoteViews(getPackageName(), R.layout.widgetlayoutx2);

  11.             views.setTextViewText(R.id.widgetclock,time)         

  12.             manager.updateAppWidget(awID, views);

  13.         }

  14.     }

이 함수가 바로 위젯에 시계를 뿌려주는 함수입니다.

 

알람매니저를 만들고 인스턴스를 참조해서 위젯에 뿌려주는데, 위젯에서 많이 봐왔던 것들이 보이네요.

 

리모트 뷰에서 아까 처음에 만들었던 텍스트뷰에 시간을 바로 뿌려주고 화면을 갱신해주면 됩니다.

 

그 전에 시간을 가져와야하는데 첫번째 하이라이트 보시면 함수를 하나 더 호출하네요.

 

 

  1.     public String getTime(){

  2.        

  3.         String time=null;

  4.         Date date=new Date(System.currentTimeMillis());

  5.         SimpleDateFormat CurTimeFormat=new SimpleDateFormat("HH:mm");

  6.         time=CurTimeFormat.format(date);

  7.         return time;

  8.     }

이게 바로 시간을 가져오는 함수입니다. 자바함수를 이용해서 'HH:mm'형식으로 시간을 가져와서 리턴해 줍니다.

 

 

 

Step last. 마지막으로 매니페스트를 꼭 등록해주셔야 합니다.

 

  1. <service android:enabled="true" android:name=".alarmService" />

 

그럼 아래와 같이 시계가 잘 가는 것을 볼 수 있습니다.

 

 

 

이 알람매니저는 시계와 같이 짧은시간 업데이트를 위해 위젯에 자주쓰입니다.

 

안드로이드에서 2.x버전으로 올라오면서 위젯 업데이트 주기가 최소 30분으로 바뀌어서 그렇다네요.

 

 

 

반응형

인기글