Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件,然后发送广播事件

复制代码
Android12类路径:
frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

  mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,
                new SystemGesturesPointerEventListener.Callbacks() {
                    @Override
                    public void onSwipeFromTop() {
                        synchronized (mLock) {
                            if (mStatusBar != null) {
                                requestTransientBars(mStatusBar);
                            }
							// 新增
							mContext.sendBroadcast(new Intent("com.android.action.showstatusbar")); //自定义优化显示状态栏
                            checkAltBarSwipeForTransientBars(ALT_BAR_TOP);
                        }
                    }

                    @Override
                    public void onSwipeFromBottom() {
                        synchronized (mLock) {
                            if (mNavigationBar != null
                                    && mNavigationBarPosition == NAV_BAR_BOTTOM) {
								
                                requestTransientBars(mNavigationBar);
                            }
							// 新增
							mContext.sendBroadcast(new Intent("com.android.action.hidestatusbar")); 
							
							// 新增
							mContext.sendBroadcast(new Intent("com.android.action.swipefrombottom")); //自定义上滑广播
						 
                            checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM);
                        }
                    }

二、状态的显示与隐藏方法

类中frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

新增状态栏显示与隐藏的两个方法

复制代码
	// 显示状态栏
	private void showStatusBar(){
		if(mPhoneStatusBarWindow!=null){
			mPhoneStatusBarWindow.setVisibility(View.VISIBLE);
		}
	}
	
	// 隐藏状态栏
	private void hideStatubar(){
		if(mPhoneStatusBarWindow!=null){
			mPhoneStatusBarWindow.setVisibility(View.GONE);
		}
	}

三、注册广播

类中 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

添加广播动作

internalFilter.addAction("com.android.action.showstatusbar");

internalFilter.addAction("com.android.action.hidestatusbar");

复制代码
    IntentFilter internalFilter = new IntentFilter();
        internalFilter.addAction(BANNER_ACTION_CANCEL);
        internalFilter.addAction(BANNER_ACTION_SETUP);
		
		//添加广播动作
	    internalFilter.addAction("com.android.action.swipefrombottom");
		//添加状态栏隐藏显示广播
		internalFilter.addAction("com.android.action.showstatusbar");
		internalFilter.addAction("com.android.action.hidestatusbar");
		
        mContext.registerReceiver(mBannerActionBroadcastReceiver, internalFilter, PERMISSION_SELF,
                null);

四、调用显示隐藏

类中frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

调用

else if("com.android.action.showstatusbar".equals(action)){

showStatusBar();

}else if("com.android.action.hidestatusbar".equals(action)){

hideStatubar();

}

复制代码
    private final BroadcastReceiver mBannerActionBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BANNER_ACTION_CANCEL.equals(action) || BANNER_ACTION_SETUP.equals(action)) {
                NotificationManager noMan = (NotificationManager)
                        mContext.getSystemService(Context.NOTIFICATION_SERVICE);
                noMan.cancel(com.android.internal.messages.nano.SystemMessageProto.SystemMessage.
                        NOTE_HIDDEN_NOTIFICATIONS);

                Settings.Secure.putInt(mContext.getContentResolver(),
                        Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, 0);
                if (BANNER_ACTION_SETUP.equals(action)) {
                    mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
                            true /* force */);
                    mContext.startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_REDACTION)
                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

                    );
                }
            }
			// 分割线
			else if("com.android.action.swipefrombottom".equals(action)){
	            //上滑事件
			     Log.d("StatusBar","swipefrombottom---666--");
			  if(!navigationBarState){
			        navigationBarState = true;
			        //加载导航栏
			        createNavigationBar(result);
			        mHandler.postDelayed(new Runnable() {
			                @Override
			                public void run() {
							  navigationBarState = false;
							// 移除导航栏
		                      mNavigationBarController.removeNavigationBar(mDisplayId);
			                }
			            },6000);
			  }
		    }else if("com.android.action.swipefromtop".equals(action)){
			     Log.d("StatusBar","swipefromtop--666-");
			//下滑事件
			   mNavigationBarController.removeNavigationBar(mDisplayId);
		   }else if("com.android.action.showstatusbar".equals(action)){
			   showStatusBar();
		   }else if("com.android.action.hidestatusbar".equals(action)){
			   hideStatubar();
		   }
			// 分割线
			
        }
    };
相关推荐
应用市场2 小时前
不用一张图片的像素小游戏:小人是字符串,房间是矩形,平衡靠两千个假玩家
android·kotlin·游戏开发
stevenzqzq3 小时前
android 对渠道的理解
android
QEasycloud3 小时前
BOM接口抛转失败钉钉通知策略实战教程:MySQL异常日志到钉钉消息的端到端配置
android·mysql·钉钉
AIsoft_86893 小时前
医患交流内容如何做好记录?
android·iphone
蒸鱼Yuzheng3 小时前
Android Native 崩溃证据链:Tombstone、Build ID 与 Trace 如何联合归因
android·ndk·tombstone·调试符号·崩溃分析
事圆则缓4 小时前
Kotlin 变量与函数:把页面状态和行为写成清楚的契约
android·开发语言·kotlin
hunterandroid4 小时前
MVVM 迁移到 MVI:复杂页面状态如何收敛
android
妖星4 小时前
Android 开机动画定制:从 bootanimation.zip 到源码编译
android
临期冰淇淋5 小时前
MTK平台 安卓16 GMS报错修改
android·java·前端
mmsx5 小时前
Android 模块化三件套:轻量组件化、宿主插件双形态、AIDL 隔离
android·网络·组件化·aidl