天天看點

【Android】Service中判斷目前是否全屏(狀态欄是否隐藏)

轉載請注明來源:http://blog.csdn.net/pur_e/article/details/50781412

       業務需要,要在背景Service中判斷目前界面是否全屏,感謝Google,幫我找到了一個解決方式:is it possible to detect when any application is in full screen in android?,現将方法研究并記錄一下。

1.原理

       上面的回答中,建立了一個overlay的不可見View,靠在視窗上方,通過調用View.getLocationOnScreen判斷其中Y軸位置的值,來判斷是否全屏,經過測試,完全可行。

2.測試

  • 先上測試圖:
    【Android】Service中判斷目前是否全屏(狀态欄是否隐藏)
    可以明顯看到,建立的View确實是會随狀态欄隐藏和顯示而上下移動的。
  • 測試代碼:
public class MyService extends Service {
    private View mCheckFullScreenView = null;
    @Override
    public void onCreate() {
        super.onCreate();
        Context ctx = getApplicationContext();
        mCheckFullScreenView = new View(ctx);
        mCheckFullScreenView.setBackgroundColor(Color.RED);
        WindowManager windowManager = (WindowManager)ctx.getSystemService(WINDOW_SERVICE);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
        //建立非模态、不可碰觸
        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                |WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
        //放在左上角
        params.gravity = Gravity.START | Gravity.TOP;
        params.height = ;
        params.width = ;
        //設定彈出View類型
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;

        windowManager.addView(mCheckFullScreenView, params);
    }
}


public class MainActivity extends Activity implements  View.OnTouchListener{

    private boolean isFullScreen = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        View rootView = findViewById(R.id.root);
        Intent intent = new Intent(this, MyService.class);
        startService(intent);

        rootView.setOnTouchListener(this);

    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Window window  = getWindow();
        if(isFullScreen){
            //設定非全屏
            window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        }else{
            //設定全屏
            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        isFullScreen = !isFullScreen;
        return false;
    }
}
           
  • 那麼其他彈出類型也會如此嗎,做了下測試:
TYPE_SYSTEM_OVERLAY:可以
    TYPE_SYSTEM_ERROR:可以
    TYPE_PHONE:可以
    TYPE_SYSTEM_ALERT:不可以
    TYPE_TOAST:不可以
           
  • PS:小米的MIUI等自定義的ROM,雖然預設不會顯示彈屏,但這個功能是可用的。也就是說這裡的不顯示,其實是隐藏,而不是直接禁止。