【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.测试

  • 先上测试图:
    这里写图片描述
    可以明显看到,创建的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 = 50;
        params.width = 50;
        //设置弹出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,虽然默认不会显示弹屏,但这个功能是可用的。也就是说这里的不显示,其实是隐藏,而不是直接禁止。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值