Android 8.0(O) TYPE_SYSTEM_ALERT
1. O(올레) 버전에서부터는
TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
이것 대신
TYPE_APPLICATION_OVERLAY
이것을 쓰도록 하자.
앱이 SYSTEM_ALERT_WINDOW 권한을 사용하고 다음과 같은 창 유형 중 하나를 사용하여 다른 앱 및 시스템 창 위에 경고 창을 표시하려고 할 경우
TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
이런 창은 항상 TYPE_APPLICATION_OVERLAY 창 유형을 사용하는 창 아래에 나타납니다. Android O를 대상으로 하는 앱의 경우, 위와 같은 창 유형을 사용할 수 없으며 TYPE_APPLICATION_OVERLAY 창 유형을 사용하여 경고 창을 표시합니다.
TYPE_APPLICATION_OVERLAY
TYPE_APPLICATION_OVERLAY 창 유형의 다음 특징을 염두에 두시기 바랍니다.
2. 코드는
int type = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
type = WindowManager.LayoutParams.TYPE_PHONE;
}
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
type,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
this.screenview = li.inflate(R.layout.calling_layout, null);
wm.addView(this.screenview, mParams);
최상위에 실행되므로, 클릭 리스너로 토스트 메세지를 출력했는데, 클릭이 안먹힌다고 착각하면 안된다~~ 최상위 뷰에 떠 있기 때문에 가려서 안보인다.