달력

2

« 2025/2 »

  • 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
728x90
반응형

안드로이드 -항상 최상위에 나오는 뷰 만들기

원본출처 : http://blog.daum.net/mailss/18

안드로이드 앱을 이것 저것 써보다 보면 어느 화면에서든지 항상 위에 떠있는 뷰를 사용하는 앱을 발견하게 될 것이다. 그 예로 battery info always라는 앱을 꼽을 수 있다.

*battery info always 설명 : http://blog.naver.com/gin073k?Redirect=Log&logNo=90127230480


그렇다면 저 앱은 어떻게 자신의 앱도 아닌데 바탕화면이던, 게임앱이던 항상 자기 뷰를 표시할 수 있을까?

그것은 안드로이드 최상위 window에 뷰를 넣었기 때문이다. 이 예제는 그 방법에 대한 예제이다.


1. 서비스 생성

자신의 앱이 종료된 후에도 항상 해당 뷰가 떠 있어야 한다. 그래서 Activity에서 뷰를 추가하는 것이 아니라 Service에서 뷰를 추가 해야 한다.


AlwaysOnTopService.java

public class AlwaysOnTopService extends Service {
@Override
public IBinder onBind(Intent arg0) { return null; }

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onDestroy() {
super.onDestroy();
}
}


2. 뷰 생성 및 최상위 윈도우에 추가

간단하게 텍스트뷰 하나 추가하는 코드이다.

private TextView tv; //항상 보이게 할 뷰. 멤버필드로 선언

@Override
public void onCreate() {
super.onCreate();

tv = new TextView(this); //뷰 생성
tv.setText("이 뷰는 항상 위에 있다.");
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필요.
}


3. 매니페스트에 퍼미션 설정

WinodwManager에 addView 메소드를 사용하려면 android.permission.SYSTEM_ALERT_WINDOW 퍼미션이 필요하다.


<manifest ................ >
<application ................ >
<activity
................
</activity>
<service
................
</service>
</application>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-sdk android:minSdkVersion="7" />
</manifest>


위와 같이 퍼미션을 설정해 주면 서비스 동작하는데 권한 설정이 안된다. service 태그 안에 퍼미션을 설정해 주어야 한다.

<service
................
android:permission="android.permission.SYSTEM_ALERT_WINDOW" >
</service>


4. 뷰 제거

서비스 종료시 뷰를 제거 해야 한다.

@Override
public void onDestroy() {
super.onDestroy();
if(tv != null) //서비스 종료시 뷰 제거. *중요 : 뷰를 꼭 제거 해야함.
{
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(tv);
tv = null;
}
}


5. 서비스 실행/중지 할 activity 만들기

AlwaysOnTopActivity.java


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)); //서비스 종료
}
}


실행 결과


앱 시작
뷰 추가
바탕화면



유투브 동영상


다음 지도


Plants VS Zombies 게임




AlwaysOnTop.zip


전체 샘플 코드 첨부하였습니다.

*글과 자료는 출처만 밝히시면 얼마든지 가져다 쓰셔도 됩니다.

728x90
반응형
:
Posted by mapagilove