广告
返回顶部
首页 > 资讯 > 精选 >Android中怎么禁止状态栏下拉
  • 614
分享到

Android中怎么禁止状态栏下拉

android 2023-05-30 21:05:25 614人浏览 薄情痞子
摘要

Android中怎么禁止状态栏下拉,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. 修改SystemUI路径:==/frameworks/base/packa

Android中怎么禁止状态栏下拉,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1. 修改SystemUI

路径:==/frameworks/base/packages/SystemUI//src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java==

通过在PhoneStatusBar.java类中注册一个广播的方式来实现状态栏的禁用和解除,其核心方法就是调用了disable()方法。disable()是SystemUI自定义的方法,感兴趣的同学可以去看其具体实现。

下面来看下我们在SystemUI中的具体实现代码:

@@ -494,6 +494,31 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {                                                            }+    //add steven zhang by 20160701+    private BroadcastReceiver mStatusshowHide = new BroadcastReceiver() {++        @Override+        public void onReceive(final Context context, Intent intent) {+            // TODO Auto-generated method stub+            String action = intent.getAction();++            if ("com.aura.statusbar.SHOW_OR_HIDE".equals(action)) {+                // StatusBarManager.DISABLE_NONE+                // StatusBarManager.DISABLE_EXPAND+                final int mode = intent.getIntExtra("mode", StatusBarManager.DISABLE_NONE);+                if (mNavigationBarView != null) {+                    mHandler.post(new Runnable() {++                        @Override+                        public void run() {++                            disable(mode);+                        }+                    });+                }+            }+        }+    };     //micheal add the Broadcast interface for Control the wifi sleep mode change begin 20150514     private BroadcastReceiver wifiSleepModeChangeReceiver = new BroadcastReceiver(){       @Override@@ -519,6 +544,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {   // ================================================================================   protected PhoneStatusBarView makeStatusBarView() {     final Context context = mContext;+        // add steven zhang by 20160701+        IntentFilter statusFilter = new IntentFilter();+        statusFilter.addAction("com.aura.statusbar.SHOW_OR_HIDE");+        context.reGISterReceiver(mStatusShowHide, statusFilter);

既然显示隐藏的广播我们已经注册好了,那么看下我们在APP中的具体调用吧。

@Overrideprotected void onResume() {    super.onResume();    Intent i = new Intent("com.aura.statusbar.SHOW_OR_HIDE");    i.putExtra("mode", StatusBarManager.DISABLE_EXPAND);    sendBroadcast(i);}@Overrideprotected void onPause() {    super.onPause();    Intent i = new Intent("com.aura.statusbar.SHOW_OR_HIDE");    i.putExtra("mode", StatusBarManager.DISABLE_NONE);    sendBroadcast(i);}

在Activity中重写onResumeonPause方法实现状态栏的禁用和解除禁用。另:StatusBarManager是一个隐藏类,所以调用的时候可能导入不了包会报错,最简单的方法就是之间用数值替换,下面列出对应关系。

public static final int DISABLE_EXPAND       = 0x00010000;public static final int DISABLE_NOTIFICATION_ICONS = 0x00020000;public static final int DISABLE_NOTIFICATION_ALERTS = 0x00040000;public static final int DISABLE_NOTIFICATION_TICKER = 0x00080000;public static final int DISABLE_SYSTEM_INFO     = 0x00100000;public static final int DISABLE_HOME        = 0x00200000;public static final int DISABLE_RECENT       = 0x01000000;public static final int DISABLE_BACK        = 0x00400000;public static final int DISABLE_CLOCK        = 0x00800000;public static final int DISABLE_SEARCH       = 0x02000000;public static final int DISABLE_NONE        = 0x00000000;public static final int DISABLE_NAVIGATION =    View.STATUS_BAR_DISABLE_HOME | View.STATUS_BAR_DISABLE_RECENT;public static final int DISABLE_MASK = DISABLE_EXPAND | DISABLE_NOTIFICATION_ICONS    | DISABLE_NOTIFICATION_ALERTS | DISABLE_NOTIFICATION_TICKER    | DISABLE_SYSTEM_INFO | DISABLE_RECENT | DISABLE_HOME | DISABLE_BACK | DISABLE_CLOCK    | DISABLE_SEARCH;

所以不能引用StatusBarManager的同学之间使用其数值是一样的。如果有源码的朋友,可以使用系统编译的后framework jar包作为APP的lib就可以直接使用StatusBarManager方法了。其路径为/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar。将classes.jar改为framework.jar导入工程就OK了。

通过上面的步骤我们知道最关键的就是调用PhoneStatusBar中disable()方法,我们这里是以广播的方式实现的,任何有新方法的同学可以脑洞大开,只要能实现调用到disable()就可以禁用状态栏。

2.修改PhoneWindowManager

路径:==/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java==

// monitor for system gesturesmSystemGestures = new SystemGesturesPointerEventListener(context,new SystemGesturesPointerEventListener.Callbacks() {  @Override  public void onSwipeFromTop() {    if (isGestureIsolated())      return;    if (mStatusBar != null) {      requestTransientBars(mStatusBar);    }  }  @Override  public void onSwipeFromBottom() {    if (isGestureIsolated())      return;    if (mNavigationBar != null && mNavigationBarOnBottom) {      requestTransientBars(mNavigationBar);    }  }  @Override  public void onSwipeFromRight() {    if (isGestureIsolated())      return;    if (mNavigationBar != null && !mNavigationBarOnBottom) {      requestTransientBars(mNavigationBar);    }  }  @Override  public void onDebug() {    // no-op  }  private boolean isGestureIsolated() {    boolean ret = false;    ret = Settings.System.getInt(mContext.getContentResolver(),"status_bar_disabled", 0) == 1;    return ret;  }});

SystemGesturesPointerEventListener.Callbacks的方法中增加一个判断函数isGestureIsolated()用于判断是否支持其对应的手势操作。在这里特别说明一下,在网上找到方法用

private boolean isGestureIsolated() {    boolean ret = false;    windowstate win = mFocusedWindow != null ? mFocusedWindow:mTopFullscreenOpaqueWindowState;    if (win != null && (win.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED) != 0)      ret = true;    else      ret = false;    return ret;}

getSystemUiVisibility()这种方式做判断的时候,获取到的win不一定是当前activity的,有时候是statusbar的,所以这样的效果不是很好,经常会下拉出状态栏,于是就有了

Settings.System.getInt(mContext.getContentResolver(),"status_bar_disabled", 0) == 1;

做判断的方法,用这种方式有一个好处就是非常直接,需要它禁止下拉的时候,就调用

Settings.System.putInt(getContentResolver(), "status_bar_disabled", 1);

就OK了,解除禁止的时候调用

Settings.System.putInt(getContentResolver(), "status_bar_disabled", 0);

看下Activity中的具体调用

@Overrideprotected void onResume() {    super.onResume();    //禁止下拉    Settings.System.putInt(getContentResolver(), "status_bar_disabled", 1);}@Overrideprotected void onPause() {    super.onPause();    //解除禁止    Settings.System.putInt(getContentResolver(), "status_bar_disabled", 0);}

在AndroidManifest.xml中声明相应的权限

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

网上还有修改PhoneWindowManager中的adjustSystemUiVisibilityLw方法的,如:

@Overridepublic int adjustSystemUiVisibilityLw(int visibility){    if (Settings.System.getInt(mContext.getContentResolver(),"status_bar_disabled", 0) == 0) {      mStatusBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility);    }    mNavigationBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility);    // Reset any bits in mForceClearingStatusBarVisibility that    // are now clear.    mResettingSystemUiFlags &= visibility;    // Clear any bits in the new visibility that are currently being    // force cleared, before reporting it.    return visibility & ~mResettingSystemUiFlags        & ~mForceClearedSystemUiFlags;}

在adjustSystemUiVisibilityLw增加一个标志的判断,但这种实现的效果也不是很好,还是会出现下拉能拉下来的情况。

综上所叙,修改PhoneWindowManager实现禁止下拉的方法还是在SystemGesturesPointerEventListener.Callbacks中增加一个内部方法,这个内部方法使用标志位的形式来判断是否支持状态栏下拉。

3. 使用StatusBarManager中方法

因为StatusBarManager是隐藏方法,所以要在IDE中直接使用的话要导入framework jar包,怎么找到framework jar在1. 修改SystemUI中有说过,这里就不重复了。直接上代码:

1.在AndroidManifest.xml中声明相应的权限

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

网上有文章说要声明

android : sharedUserId="android.uid.system"

亲自测试没有加上面这行代码,也是可以使用的。

2. 在Activity中的引用

@Overrideprotected void onResume() {    super.onResume();    StatusBarManager statusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);    statusBarManager.disable(StatusBarManager.DISABLE_EXPAND);}@Overrideprotected void onPause() {    super.onPause();    StatusBarManager statusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);    statusBarManager.disable(StatusBarManager.DISABLE_NONE);}

是使用系统签名,编译为系统app

java -jar signapk.jar platfORM.x509.pem platform.pk8 TestDemo.apk TestDemoNew.apk

TestDemoNew.apk就是系统签名后的apk,然后push到/system/app/目录下就ok了。关于签名的知识就不多说了,可自行找到相关资料。

下面看下原生系统中电话处理禁止下拉的做法,代码如下:

路径:==/packages/apps/Phone/src/com/android/phone/NotificationMgr.java==

private void updateStatusBar() {  int state = StatusBarManager.DISABLE_NONE;  if (!mIsExpandedViewEnabled) {    state |= StatusBarManager.DISABLE_EXPAND;  }  if (!mIsNotificationEnabled) {    state |= StatusBarManager.DISABLE_NOTIFICATION_ALERTS;  }  if (!mIsSystemBarNavigationEnabled) {    // Disable *all* possible navigation via the system bar.    state |= StatusBarManager.DISABLE_HOME;    state |= StatusBarManager.DISABLE_RECENT;    state |= StatusBarManager.DISABLE_BACK;  }  if (DBG) log("updateStatusBar: state = 0x" + Integer.toHexString(state));  mStatusBarManager.disable(state);}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: Android中怎么禁止状态栏下拉

本文链接: https://www.lsjlt.com/news/221403.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么禁止状态栏下拉
    Android中怎么禁止状态栏下拉,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. 修改SystemUI路径:==/frameworks/base/packa...
    99+
    2023-05-30
    android
  • Android开发之禁止下拉通知栏的方法
    本文实例讲述了Android开发之禁止下拉通知栏的方法。分享给大家供大家参考,具体如下: 1.在AndroidManifest.xml中添加权限 <uses-permi...
    99+
    2022-06-06
    方法 android开发 Android
  • Android中状态栏与标题栏怎么进行隐藏
    今天就跟大家聊聊有关Android中状态栏与标题栏怎么进行隐藏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方法一:public class MainActivity extends...
    99+
    2023-05-31
    android roi %d
  • android隐藏状态栏怎么实现
    要在Android中隐藏状态栏,可以使用以下方法之一:1. 使用全屏模式:在Activity的onCreate()方法中调用以下代码...
    99+
    2023-10-11
    android
  • Android中怎么实现沉浸式状态栏
    这篇文章给大家介绍Android中怎么实现沉浸式状态栏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在布局文件中第一个控件(一般是imageview或者textview)中添加两个属性。<!--沉浸式-->...
    99+
    2023-05-30
    android
  • android沉浸式状态栏怎么实现
    要实现Android沉浸式状态栏,可以按照以下步骤进行操作:1. 在styles.xml文件中定义一个没有ActionBar的主题,...
    99+
    2023-09-27
    android
  • Android中的半透明状态栏怎么实现
    在Android中实现半透明状态栏,可以按照以下步骤来操作:1. 首先,在你的`styles.xml`文件中定义一个样式,用于控制状...
    99+
    2023-09-28
    android
  • Android应用中怎么动态显示与隐藏状态栏
    这篇文章给大家介绍Android应用中怎么动态显示与隐藏状态栏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是沉浸式?先来分析一下叫错的原因吧,之所以很多人会叫错,是因为根本就不了解沉浸式是什么意思,然后就人云亦云...
    99+
    2023-05-31
    android roi
  • android状态栏显示短信怎么实现
    要在Android的状态栏中显示短信,你需要创建一个BroadcastReceiver来接收短信,并在接收到短信时将其显示在状态栏上...
    99+
    2023-08-12
    android
  • Android应用怎么实现隐藏状态栏
    这篇文章将为大家详细讲解有关Android应用怎么实现隐藏状态栏,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  方法一:public class MainActivit...
    99+
    2023-05-31
    android roi
  • Android应用中怎么对状态栏进行设置
    Android应用中怎么对状态栏进行设置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 状态栏的设置适配问题详解最近看了很多关于状态栏的问题的处理,总结出处理状态...
    99+
    2023-05-31
    android roi
  • Android应用中怎么实现自定义状态栏
    这篇文章给大家介绍Android应用中怎么实现自定义状态栏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、目标:Android5.0以上二、步骤1、在res-values-colors.xml下新建一个RGB颜色 ...
    99+
    2023-05-31
    android roi
  • Android 12.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析
    1.前言   在android12.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需...
    99+
    2023-09-09
    android systemui 下拉状态栏 下拉状态栏左滑 下拉状态栏右滑
  • Android 开发中怎么改变沉浸式状态栏的颜色
    这篇文章给大家介绍Android 开发中怎么改变沉浸式状态栏的颜色,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。这个是基于SystemBarTintManager更改的增加一个方法:用于更改MIUIV6系统上的状态栏字...
    99+
    2023-05-31
    android roi
  • Android应用怎么实现一个沉浸式状态栏
    这期内容当中小编将会给大家带来有关Android应用怎么实现一个沉浸式状态栏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。效果。导航栏问题在Android中,顶部导航栏目前常用的两种实现方式,一个是通过T...
    99+
    2023-05-31
    android roi
  • Android应用怎么实现一个浮动状态栏效果
    这期内容当中小编将会给大家带来有关Android应用怎么实现一个浮动状态栏效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先:要实现的是浮动状态栏效果,通过在Activity的onCreate方法中调...
    99+
    2023-05-31
    android roi
  • Android中怎么利用EditText禁止输入表情
    这期内容当中小编将会给大家带来有关Android中怎么利用EditText禁止输入表情,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。InputFilter inputFilter= n...
    99+
    2023-05-30
    edittext android
  • Android怎么禁止向EditText控件中输入内容
    这篇文章主要介绍了Android怎么禁止向EditText控件中输入内容,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在Android开发中经常会遇到EditText控件...
    99+
    2023-05-30
    android edittext控件
  • Android Studio中怎么绑定下拉框数据
    本篇文章为大家展示了Android Studio中怎么绑定下拉框数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。页面xml代码<TextView android:id="...
    99+
    2023-05-30
    android studio
  • Android中怎么监听软键盘状态
    本篇文章为大家展示了Android中怎么监听软键盘状态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 监听软键盘状态的实例详解activityRoot是activity的根view,就...
    99+
    2023-05-30
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作