[펌] 항상 최상위에 나오는 뷰 만들기

like miller 님의 블로그 글에서 가져온 정보입니다.

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0NADc&articleno=18&categoryId=3&regdt=20111117114647&totalcnt=20

 

안드로이드 앱을 이것 저것 써보다 보면 어느 화면에서든지 항상 위에 떠있는 뷰를 사용하는 앱을 발견하게 될 것이다. 그 예로 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 on_clickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViewById(R.id.start).seton_clickListener(this);        //시작버튼
        findViewById(R.id.end).seton_clickListener(this);            //중시버튼
    }
    
    @Override
    public void on_click(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 게임
 

 

 

 

*터치 이벤트는 '항상 최상위에 나오는 뷰 만들기2'를 참고하세요.

 AlwaysOnTop.zip

 

like miller 님의 블로그 글에서 가져온 정보입니다.

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0NADc&articleno=18&categoryId=3&regdt=20111117114647&totalcnt=20

Post Author: TORTUGA

TORTUGA
궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

댓글 남기기

이메일은 공개되지 않습니다.