Android关闭/隐藏通知栏

时间:2016-02-16 17:01:40

标签: android debugging dialog

当我尝试关闭应用程序中的通知栏时出现问题。

这是我试图关闭它的地方

@Override
    public void onWindowFocusChanged(boolean hasFocus)
    {
        Log.i("FocusChanged", "Focus changed");
        if(!hasFocus)
        {
            Log.e("Focus debug", "Lost focus !");
// Close every kind of system dialog
            Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            getApplicationContext().sendBroadcast(closeDialog);
            Log.i("FocusChanged", "Focus changed - iam supposed to close this dialogs");
        }
        super.onWindowFocusChanged(hasFocus);
    }

但它不起作用。 除非我在函数中添加断点。

每当我打开系统通知时,我都会得到说“焦点已更改”的日志,所以我的应用程序运行代码,但是hasFocus没有设置为true,或者正如我说的那样只有运行调试器并在函数中设置断点

1 个答案:

答案 0 :(得分:2)

我们无法阻止在kitkat设备中以全屏模式显示状态,因此制作了一个仍然符合要求的黑客攻击,即阻止状态栏扩展。

为此,该应用程序未全屏显示。我们在状态栏上放置了一个叠加层并消耗了所有输入事件。它阻止了地位的扩大。

<强> 注意:

  • customViewGroup是自定义类,可扩展任何布局(框架,相对布局等)并消耗触摸事件。
  • 使用touch事件覆盖视图组的onInterceptTouchEvent方法并返回true

您还需要设置Android权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

您需要一个扩展的ViewGroup类来处理Touch事件

public class customViewGroup extends ViewGroup {

        public customViewGroup(Context context) {
            super(context);
        }

        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            Log.v("customViewGroup", "**********Intercepted");
            return true;
        }
    }

在要禁用通知栏的活动中,需要添加此功能(不要忘记添加字段变量CustomViewGroup blockingView)

private void disableNotificationBar(){
    WindowManager manager = ((WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE));

    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
    localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    localLayoutParams.gravity = Gravity.TOP;
    localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|

                // this is to enable the notification to recieve touch events
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |

                // Draws over status bar
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

        localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
        localLayoutParams.height = (int) (50 * getResources()
                .getDisplayMetrics().scaledDensity);
        localLayoutParams.format = PixelFormat.TRANSPARENT;

        blockingView = new CustomViewGroup(this);

        manager.addView(blockingView, localLayoutParams);
}

然后在你onCreate你需要打电话

protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ....
        disableNotificationBar();
}

您需要在onDestroy()上将其删除才能关闭您的应用程序

@Override
protected void onDestroy() {

    super.onDestroy();
    if (blockingView!=null) {
        WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
        manager.removeView(blockingView);
    }
}

您还需要根据之前的答案40来调整叠加层大小,但您不希望阻止用户对您自己的应用执行操作,如果叠加到高度它也会拦截您的活动上的事件

另外在Android版&gt;到5.1你需要得到用户的额外许可,在函数调用的onCreate函数中添加这个权限

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            if (!Settings.canDrawOverlays(this)) {
                Toast.makeText(this, "Please give my app this permission!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
            } else {
                disableNotificationBar();
            }
        }
        else {
            disableNotificationBar();
        }