안녕하십니까? 안드로이드 공부하는 학생입니다.
저는 전체 윈도우중 일정 부분을 차지하는 최상위 뷰에서, 어딘가에서 정보를 가져와 주기적으로 띄워주는 것을 만들고 싶습니다. 배터리나 시간표시같은 것이 유사하다고 볼 수 있습니다.
다음 블로그(http://blog.daum.net/mailss/18)에서 항상 최상위에 놓는 뷰 예제를 확인하였는데요,
이 예제는 액티비티에서 스타트 버튼을 누르면 서비스가 실행되면서 최상위 뷰를 생성합니다. 스탑 버튼을 누르면 서비스 종료와 동시에 뷰도 제거가 됩니다.
제가 시도하고 있는것은 일정 시간마다 뷰를 갱신하여 텍스트를 바꾸고 싶은데, 제 짧은 지식으로는 어떤식으로 고쳐야 할지 모르겠습니다. 다음 코드에서 Service에 정의된 count 변수를 일정시간마다 증가시켜 보여주고 싶습니다.
스택오버플로우(http://stackoverflow.com/questions/24504759/updating-the-android-view-which-is-always-on-top) 에서도 질문하였으나, LocalBroadcastManager를 이용하라는데 잘 이해가 안되고 있습니다.
도움 주시면 감사하겠습니다.

1. AlwaysOnTopActivity.java
package pe.sbk.alwaysontop;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class AlwaysOnTopActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.start).setOnClickListener(this);//시작버튼
findViewById(R.id.end).setOnClickListener(this);//중시버튼
}
@Override
public void onClick(View v) {
int view = v.getId();
if(view == R.id.start)
startService(new Intent(this, AlwaysOnTopService.class)); //서비스 시작
else
stopService(new Intent(this, AlwaysOnTopService.class)); //서비스 종료
}
}
2. AlwaysOnTopService.java
package pe.sbk.alwaysontop;
import android.app.Service;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.TypedValue;
import android.view.WindowManager;
import android.widget.TextView;
public class AlwaysOnTopService extends Service {
private TextView tv; //항상 보이게 할 뷰
@Override
public IBinder onBind(Intent arg0) { return null; }
private int count=0; //몇번 뷰를 갱신하였는지 체크할 예정
@Override
public void onCreate() {
super.onCreate();
tv = new TextView(this); //뷰 생성
tv.setText("This view is always on top");
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tv.setTextColor(Color.BLUE);
//최상위 윈도우에 넣기 위한 설정
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, //항상 최 상위에 있게
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, //터치 인식, 나중에 기능 추가를 위해 일단 넣어둠
PixelFormat.TRANSLUCENT); //투명
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //윈도우 매니저 불러옴.
wm.addView(tv, params); //최상위 윈도우에 뷰 넣기. *중요 : 여기에 permission을 미리 설정해 두어야 한다. 매니페스트에
}
@Override
public void onDestroy() {
super.onDestroy();
if(tv != null) //서비스 종료시 뷰 제거. *중요 : 뷰를 꼭 제거 해야함.
{
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(tv);
tv = null;
}
}
}