마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

서비스 질문입니다!!!

0 추천

 안녕하세요.

 

현재 서비스 뷰 구현 중 막히는부분이 있어 질문드립니다.

 

하려고 하는 것은 서비스에 뷰를 만들고 항상 최상위에 띄워두려고 합니다.

뷰를 띄우는데까지 구현이 되었으나, 막히는 부분은 서비스뷰에서 포커스가 떠났을 시, 서비스뷰는 항상 보여야하나

서비스뷰 외의 부분을 클릭하거나 시스템키를 누르면 서비스에 구애받지 않고 입력되어야 합니다.

 

지금 구현한 코드로는 서비스뷰외의 드래그밑 클릭 이벤트들은 정상적으로 받아지지만, 백키, 메뉴키가 먹지 않는

상태입니다.

 

이를테면 안드로이드폰의 DMB기능 중 서비스로 띄우면 DMB를 시청하면서 다른 모든 행동을 할 수 있도록 해야 하며,

서비스뷰의 영역 클릭 시, 뷰 영역안에 버튼이나 EditText의 키보드가 동작 해야 한다는 겁니다.

 

가장 원하는 것은 서비스 뷰에 포커스가 있을 시 백키를 누르면 서비스뷰는 보일 뿐 백키, 클릭이벤트등은 배경으로

먹혀야 하고 서비스뷰 터치 시 서비스로 이벤트가 들어와야 합니다.

소스 첨부합니다. 감사합니다

 

public class AlwaysOnTopService extends Service {
private Button	remove;
private EditText	edt1;
private LinearLayout	move_layout;
private int	_yDelta;
private LayoutInflater	m_inflater = null;
private View	convertView;
private WindowManager	wm;
@Override
public IBinder onBind(Intent intent) {
Log.d("","11111 1" + intent.getAction());
Log.d("","11111 2" + intent.getDataString());
return null;
}

@Override
public void onCreate() {
super.onCreate();
m_inflater	= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView	= m_inflater.inflate(R.layout.main, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FILL_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,   //항상 최 상위에 있게
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,       //터치 인식
                PixelFormat.TRANSLUCENT);    
params.gravity = Gravity.TOP;
wm = (WindowManager)getSystemService(WINDOW_SERVICE);
wm.addView(convertView, params);
remove = (Button) convertView.findViewById(R.id.remove);
move_layout = (LinearLayout) convertView.findViewById(R.id.move);
edt1 = (EditText) convertView.findViewById(R.id.edt1);
edt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","22222");
}
});
move_layout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
   final int Y = (int) event.getRawY();
   switch (event.getAction() & MotionEvent.ACTION_MASK) {
       case MotionEvent.ACTION_DOWN:
       	WindowManager.LayoutParams lParams = (WindowManager.LayoutParams) v.getLayoutParams();
           _yDelta = Y - lParams.y;
           break;
       case MotionEvent.ACTION_UP:
           break;
       case MotionEvent.ACTION_POINTER_DOWN:
           break;
       case MotionEvent.ACTION_POINTER_UP:
           break;
       case MotionEvent.ACTION_MOVE:
       	WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) v.getLayoutParams();
           layoutParams.y = Y - _yDelta;
           wm.updateViewLayout(v, layoutParams);
           break;
   }
return false;
}
});
remove.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onDestroy();
}
});
 
}

@Override
public boolean onUnbind(Intent intent) {
Log.d("","11111");
return super.onUnbind(intent);
}

@Override
public void onDestroy() {
super.onDestroy();
if(convertView != null)
{
((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(convertView);
convertView = null;
}
}
}

 

alaywwwa (120 포인트) 님이 2014년 2월 8일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...