4

I was wondering whether to display SystemUI and Listenering. The window is created in Service

package com.example.testwindow;


import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

import com.android.internal.policy.PolicyManager;

public class WindowManagerService extends Service {

    private String TAG ="WindowManagerService";
    private Context mContext;
    private WindowManager mWindowManager;
    private Window mWindow;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate view");
        this.mWindowManager = ((WindowManager) getSystemService("window"));

        mContext = this;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        int i = super.onStartCommand(intent, flags, startId);
        View editWindow = LayoutInflater.from(mContext).inflate(R.layout.activity_main, null);
        mWindow = addWindow(editWindow, 0, 0, LayoutParams.TYPE_PHONE);

        int mSystemUiVisibility = mWindow.getDecorView().getSystemUiVisibility();
        mWindow.getDecorView().setOnSystemUiVisibilityChangeListener(new  View.OnSystemUiVisibilityChangeListener(){

            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                Log.e(TAG,"systemUI onSystemUiVisibilityChange ="+visibility);
            }

        });
        Log.e(TAG, "mSystemUiVisibility ="+mSystemUiVisibility);

        WindowManager.LayoutParams layoutParams = mWindow.getAttributes();
        layoutParams.x = 0;
        layoutParams.y = 0;
        layoutParams.width = 500;
        layoutParams.height = 600;
        layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
        layoutParams.hasSystemUiListeners = true;
        layoutParams.setTitle("WindowManagerService");
        mWindow.setAttributes(layoutParams);
        mWindowManager.updateViewLayout(mWindow.getDecorView(), layoutParams);
        return i;
    }


    public WindowManager.LayoutParams createLayoutParams() {
        Log.i(TAG , "createLayoutParams");
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
                 LayoutParams.TYPE_SYSTEM_ERROR,
                 LayoutParams.FLAG_NOT_FOCUSABLE,
                 PixelFormat.TRANSLUCENT);
        layoutParams.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_PAN;
        layoutParams.setTitle(getClass().getName());
        return layoutParams;
    }

    public Window addWindow(View paramView, int width, int height,
            int type) {
        Log.i(TAG, "addWindow view");
        WindowManager.LayoutParams layoutParams = createLayoutParams();     
        Window localWindow = PolicyManager.makeNewWindow(this.mContext);
        if (localWindow != null) {
            localWindow.setWindowManager(this.mWindowManager, null, null);
            localWindow.requestFeature(Window.FEATURE_NO_TITLE);
            localWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            layoutParams.width = width;
            layoutParams.height = height;
            layoutParams.type = type;
            layoutParams.format= PixelFormat.TRANSPARENT;
            layoutParams.flags = (LayoutParams.FLAG_NOT_FOCUSABLE | layoutParams.flags);
            localWindow.setAttributes(layoutParams);
            localWindow.setContentView(paramView);
            View localView = localWindow.getDecorView();
            if (localView != null) {
                localView.setVisibility(View.VISIBLE);
                this.mWindowManager.addView(localView, layoutParams);
            }
            return localWindow;
        }   
        return null;
    }


    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onDestroy() {
        if (mWindow != null) {
            mWindowManager.removeView(mWindow.getDecorView());
            mWindow = null;
        }
        super.onDestroy();
    }
}

When I start service,Other App changed to FULLSCREEN or not ,I can't get the log "systemUI onSystemUiVisibilityChange ="

Can someone explain the behaviour? Why can't listener the change?

Frank.Zeng
  • 41
  • 1
  • 3
  • This may help http://stackoverflow.com/questions/18551135/receiving-hidden-status-bar-entering-a-full-screen-activity-event-on-a-service/19201933#19201933 – Kevin Lee Feb 17 '16 at 17:32
  • Since PolicyManager.makeNewWindow is not recognized the following code will replace for new SDK: String phone_window_calss = "com.android.internal.policy.PhoneWindow"; Class phoneWindowClass = null; try { phoneWindowClass = Class.forName(phone_window_calss); Constructor constructor = phoneWindowClass.getDeclaredConstructor(new Class[]{Context.class}); mWindow = (Window) constructor.newInstance(context); } catch (Exception e) {} – Duna Nov 22 '18 at 09:51

1 Answers1

1

You can try to add the listener before calling addView.

Steve Guo
  • 11
  • 1