Android 8.0(O) TYPE_SYSTEM_ALERT

Programming/Android 2018. 4. 5. 12:38 Posted by 생각하는로뎅
반응형

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);



최상위에 실행되므로, 클릭 리스너로 토스트 메세지를 출력했는데, 클릭이 안먹힌다고 착각하면 안된다~~ 최상위 뷰에 떠 있기 때문에 가려서 안보인다.




반응형