안녕하세요.
현재 서비스 뷰 구현 중 막히는부분이 있어 질문드립니다.
하려고 하는 것은 서비스에 뷰를 만들고 항상 최상위에 띄워두려고 합니다.
뷰를 띄우는데까지 구현이 되었으나, 막히는 부분은 서비스뷰에서 포커스가 떠났을 시, 서비스뷰는 항상 보여야하나
서비스뷰 외의 부분을 클릭하거나 시스템키를 누르면 서비스에 구애받지 않고 입력되어야 합니다.
지금 구현한 코드로는 서비스뷰외의 드래그밑 클릭 이벤트들은 정상적으로 받아지지만, 백키, 메뉴키가 먹지 않는
상태입니다.
이를테면 안드로이드폰의 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;
}
}
}