Android - Home 버튼이 눌려도 항상 상단에 떠 있는 View 만들기.

또 오랜만에 글을 남깁니다.
핑계지만, 회사일에 쫓기다 보니 그간의 개발을 정리할 틈이 없었습니다;;
음... 빨리 정리해서 올리겠습니다;

회사에서 일을 하다가 홈버튼을 제어할 일이 생겼습니다.
그리고 자연스럽게 벽에 막혔습니다.
Google 이 다른 버튼은 다 제어할 수 있게 했지만, 홈버튼 만큼은 건드리지 못하게 해뒀더라구요.

앱이 멈췄을 때를 생각하면 당연한 일이지요.
앱이 멈췄는데, 홈버튼을 눌러도 밖으로 나가지지 않는다?
홈으로 나가려면 기기를 다시 시작해야 한다?
그 앱 개발자는 엄청나게 욕 먹을 거라고 확신할 수 있습니다.

해서 열심히 구글링하고 찾아보고 조사해봤습니다.
그 때 어느 분의 포스팅을 보게 되었습니다. (그 분의 블로그 주소는 기억이 나지 않습니다...)
그 포스팅의 내용은 'Service 에 View 를 올리면 홈버튼에서 자유로워진다' 는 거였지요.

그래서 바로 개발에 착수했습니다.
제 나름대로의 단계를 만들어서 개발을 시작했지요.

1. Service 에서 xml 을 inflate 해서 출력하기.
2. 홈버튼을 비롯한 다른 버튼들이 눌려도 내려오지 않게, 항상 최상단에 위치하게 만들기.
3. Service 와 MainActivity 가 연결하기.
- Activity 에서 Service 에 있는 함수 호출하기.
- Service 에서 Activity 에 있는 함수 호출하기.

위 방식으로 개발을 진행하기로 했습니다.

오늘은 1단계와 2단계, "버튼이 눌려도 항상 상단에 떠 있는 View 만들기" 에 대해서만 포스팅하겠습니다.
우선, 최상단에 올릴 layout xml 을 만들어 봅시다.
저는 service_main.xml 이라고 이름 붙인 xml 파일을 만들어 봤습니다.

상단, 중단, 하단으로 나누고 각 영역에 텍스트 뷰를 하나씩 넣은 심심한 layout 이 만들어졌습니다.

그럼, 이 녀석을 올릴 서비스 클래스를 만들어보겠습니다.

몇몇 설명을 주석으로 덧붙이긴 했습니다만, 잘 이해가 안되는 부분이 있을 수 있지요?
그럴 땐 댓글 달아주시면 공부해서라도 답변 드리겠습니다;;

아무튼, 이런 식으로 서비스 클래스를 구현했습니다.
이제 Activity 에서 이 서비스를 시작해주면 1단계와 2단계가 끝난답니다.
그럼 Activity 클래스의 코드를 확인해보지요.

얼마 되지도 않는 main Activity 가 만들어졌습니다;
이 몇 줄 짜리 코드가 서비스를 시작하게 만들고, 우리가 만든 뷰를 항상 최상단에 있게 만들지요.


여기까지만 하면 끝! 이라고 하고 싶지만,
manifest 코드를 약간 손을 봐야 합니다.
permission 도 줘야하고, 서비스도 등록해야 하거든요.
그럼 manifest 코드도 확인해보겠습니다.

이제 여러분은 최상단에 뷰를 그리실 수 있을 겁니다 !
다만, 여기까지 개발한 뒤에 앱을 실행시키시면, 앱을 종료할 수가 없을거에요.
서두에서도 말했듯, 저를 욕하게 되실겁니다;
빠른 시일내로 이 서비스를 종료하는 방법, activity 와 service 를 연결해서 사용하는 방법 등을 정리해서 가지고 오겠습니다;
조금이나마 도움이 될 수 있으면 좋겠네요~


덧. 참고링크
위 링크에 연결된 블로그에 가시면, 저보다 훨씬 전에 이 부분을 개발하신 분이 계십니다.
참고하시면 더 많은 것을 공부하실 수 있지 않을까 합니다.


긴 글 봐주셔서 감사합니다~

CloudD

예술하는 프로그래머, 코딩하는 예술가

7 댓글

  1. 정보 감사합니다.!
    근데 그 설명에는 터치이벤트 받고 할수있다고 쓰셧는데
    터치가안되요 ;
    그리고 터치 이벤트를 넣어서 터치시 뒤로가거나 무언가를하려고할때 어디에다가 넣어야되요? 예시나 방법 가르쳐주시면 감사하겠습니다 ㅠㅠ

    답글삭제
  2. 제가 xml에 추가하면 나오는 일반버튼처럼 나오게하고, 엑티비티를 옮겨도 계속 뜨게하고싶어서 참고하게 됬습니다, 그런데 버튼이벤트를 넣어서 버튼 클릭하면 서비스 종료? 버튼이 사라지게 하려고 합니다. 즉 Exit 라는 버튼을 계속 뜨게하고싶지만 터치하면 종료가되는.. 그런식으로여. 그래서
    1. 이벤트를 어떻게 추가하는지..

    2. 종료하려면 어떻게 해야하는지..

    3. WindowManager.LayoutParams.TYPE_PHONE,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    이거 헷갈리신건 아니신지.. 가능하게 하셧다고하셧는데 NOT이 들어가잇어서요 ;

    귀찮으시겠지만 조언 부탁드립니다.

    답글삭제
    답글
    1. 읽어주셔서 감사합니다.
      회사 일이 정리가 안되어서 글을 마무리 짓지 못하고 있었습니다.
      이번 주말 안으로 part 2 마저 적도록 하겠습니다.

      삭제
    2. 주말 안에 작성하고 싶었는데, 조금 늦었습니다...ㅠ
      part 2가 도움이 될지는 모르겠지만, 작성해봤습니다.
      읽고 잘 안되시면 다시 댓글 달아주세요.

      삭제
  3. 선생의 설명 중에

    android 6.0 marshmellow ... 6.0 단말기 쓰시는 분들은 이거 안 돌아갈거에요.

    라는 말씀이 보여서 덧붙입니다.

    - 참 전에도 그랬는데 글 한 번 올리면 두 번씩 기록되는 현상이 또 있네요. 이번에는 안 지웁니다.

    안 돌아가는 분들은 아래 페이지 다운해서 돌려보세요.

    http://itmir.tistory.com/548

    참고할 분들이 있을까 해서 ...

    답글삭제
    답글
    1. 안드로이드 6.0 부터는 퍼미션 승인 개념이 들어가서, 해당 퍼미션을 처리해주는 로직을 넣어야 합니다; 그걸 코드는 만들어두고는 계속 야근만 하다가 업데이트를 못하고 있네요;

      추석에라도 시간을 내서 업데이트 하도록 하겠습니다;;

      삭제
다음 이전