Android编程实现禁止状态栏下拉的方法详解

Android编程实现禁止状态栏下拉的方法详解,第1张

概述本文实例讲述了Android编程实现禁止状态栏下拉的方法。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID编程实现禁止状态栏下拉的方法。分享给大家供大家参考,具体如下:

简介

项目需求APP全屏时,要禁止状态栏的下拉,这个应该是一个普遍的需求了吧,但AndroID系统没有直接提供给普通APP直接调用的接口。那么我们只能自己想办法增加接口去实现该功能了。

具体实现方法

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了。

通过上面的步骤我们知道最关键的就是调用Phonestatusbardisable()方法,我们这里是以广播的方式实现的,任何有新方法的同学可以脑洞大开,只要能实现调用到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(),0) == 1;

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

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

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

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

看下Activity中的具体调用

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

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

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

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

@OverrIDepublic int adjustsystemUIVisibilityLw(int visibility){    if (Settings.System.getInt(mContext.getContentResolver(),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);}

1.是使用系统签名,编译为系统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==

/** * Updates the status bar to reflect the current desired state. */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);}

从这个方法中我们知道系统禁用状态栏的方法就是调用StatusbarManager实现的。

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体 *** 作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android编程实现禁止状态栏下拉的方法详解全部内容,希望文章能够帮你解决Android编程实现禁止状态栏下拉的方法详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存