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();
		   }
			// 分割线
			
        }
    };
相关推荐
数智工坊3 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
故渊at4 小时前
第二板块:Android 四大组件标准化学理 | 第八篇:Service 后台执行实体与优先级
android·gitee·service·前台服务·后台服务
会Tk矩阵群控的小木5 小时前
安卓群控系统对于游戏工作室实战教程
android·运维·游戏·adb·开源软件·个人开发
qeen876 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
故渊at6 小时前
第二板块:Android 四大组件标准化学理 | 第九篇:BroadcastReceiver 事件分发与有序广播
android·gitee·broadcast·广播·动态注册·静态注册
JohnnyDeng946 小时前
【Android】Room 数据库高级用法与性能调优:从查询瓶颈到毫秒级响应
android·性能优化·kotlin·room
zeqinjie6 小时前
Flutter 折叠屏 iPad / 宽屏适配实践
android·前端·flutter
ab_dg_dp6 小时前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python
Arrom7 小时前
DLNA 渲染端排障实战:从 20s 卡顿到 stale subscriber 的两周追凶之旅
android·java