转载请注明来源: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,虽然默认不会显示弹屏,但这个功能是可用的。也就是说这里的不显示,其实是隐藏,而不是直接禁止。

更多相关文章

  1. Android(安卓)Studio如何更改JDK和SDK的路径?
  2. android中checkbox的padding引发的问题
  3. Android(安卓)学习记录-SQLite
  4. Android(安卓)studio 百度地图开发(2)地图定位
  5. android AndroidManifest.xml文件解析
  6. Android(安卓)Dialog Activity
  7. Android权限总结
  8. Android布局管理(4)
  9. Android开发之MediaPlayer使用

随机推荐

  1. iphone开发之常用控件的使用详解
  2. 【Android】 NDK开发基础
  3. android架构介绍
  4. 探究Android 中 WebView 与 JS 的交互
  5. Android使用DrawerLayout和ToolBar实现仿
  6. [转]Android(安卓)3D 编程:HelloArrow(用 O
  7. android 图形系统加速学习系列 (一)
  8. 获取PCM音频数据的声音分贝值
  9. Android(安卓)App 使用javax.mail.* API
  10. Android应用架构之MVVM模式