Android編程實現(xiàn)禁止狀態(tài)欄下拉的方法詳解
本文實例講述了Android編程實現(xiàn)禁止狀態(tài)欄下拉的方法。分享給大家供大家參考,具體如下:
簡介
項目需求APP全屏時,要禁止狀態(tài)欄的下拉,這個應(yīng)該是一個普遍的需求了吧,但Android系統(tǒng)沒有直接提供給普通APP直接調(diào)用的接口。那么我們只能自己想辦法增加接口去實現(xiàn)該功能了。
具體實現(xiàn)方法
1. 修改SystemUI
路徑:==/frameworks/base/packages/SystemUI//src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java==
通過在PhoneStatusBar.java類中注冊一個廣播的方式來實現(xiàn)狀態(tài)欄的禁用和解除,其核心方法就是調(diào)用了disable()方法。disable()是SystemUI自定義的方法,感興趣的同學可以去看其具體實現(xiàn)。
下面來看下我們在SystemUI中的具體實現(xiàn)代碼:
@@ -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);
既然顯示隱藏的廣播我們已經(jīng)注冊好了,那么看下我們在APP中的具體調(diào)用吧。
@Override
protected void onResume() {
super.onResume();
Intent i = new Intent("com.aura.statusbar.SHOW_OR_HIDE");
i.putExtra("mode", StatusBarManager.DISABLE_EXPAND);
sendBroadcast(i);
}
@Override
protected void onPause() {
super.onPause();
Intent i = new Intent("com.aura.statusbar.SHOW_OR_HIDE");
i.putExtra("mode", StatusBarManager.DISABLE_NONE);
sendBroadcast(i);
}
在Activity中重寫onResume和onPause方法實現(xiàn)狀態(tài)欄的禁用和解除禁用。另:StatusBarManager是一個隱藏類,所以調(diào)用的時候可能導入不了包會報錯,最簡單的方法就是之間用數(shù)值替換,下面列出對應(yīng)關(guān)系。
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的同學之間使用其數(shù)值是一樣的。如果有源碼的朋友,可以使用系統(tǒng)編譯的后framework jar包作為APP的lib就可以直接使用StatusBarManager方法了。其路徑為/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar。將classes.jar改為framework.jar導入工程就OK了。
通過上面的步驟我們知道最關(guān)鍵的就是調(diào)用PhoneStatusBar中disable()方法,我們這里是以廣播的方式實現(xiàn)的,任何有新方法的同學可以腦洞大開,只要能實現(xiàn)調(diào)用到disable()就可以禁用狀態(tài)欄。
2.修改PhoneWindowManager
路徑:==/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java==
// monitor for system gestures
mSystemGestures = 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的方法中增加一個判斷函數(shù)isGestureIsolated()用于判斷是否支持其對應(yīng)的手勢操作。在這里特別說明一下,在網(wǎng)上找到方法用
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的,所以這樣的效果不是很好,經(jīng)常會下拉出狀態(tài)欄,于是就有了
Settings.System.getInt(mContext.getContentResolver(),"status_bar_disabled", 0) == 1;
做判斷的方法,用這種方式有一個好處就是非常直接,需要它禁止下拉的時候,就調(diào)用
Settings.System.putInt(getContentResolver(), "status_bar_disabled", 1);
就OK了,解除禁止的時候調(diào)用
Settings.System.putInt(getContentResolver(), "status_bar_disabled", 0);
看下Activity中的具體調(diào)用
@Override
protected void onResume() {
super.onResume();
//禁止下拉
Settings.System.putInt(getContentResolver(), "status_bar_disabled", 1);
}
@Override
protected void onPause() {
super.onPause();
//解除禁止
Settings.System.putInt(getContentResolver(), "status_bar_disabled", 0);
}
在AndroidManifest.xml中聲明相應(yīng)的權(quán)限
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
網(wǎng)上還有修改PhoneWindowManager中的adjustSystemUiVisibilityLw方法的,如:
@Override
public 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增加一個標志的判斷,但這種實現(xiàn)的效果也不是很好,還是會出現(xiàn)下拉能拉下來的情況。
綜上所敘,修改PhoneWindowManager實現(xiàn)禁止下拉的方法還是在SystemGesturesPointerEventListener.Callbacks中增加一個內(nèi)部方法,這個內(nèi)部方法使用標志位的形式來判斷是否支持狀態(tài)欄下拉。
3. 使用StatusBarManager中方法
因為StatusBarManager是隱藏方法,所以要在IDE中直接使用的話要導入framework jar包,怎么找到framework jar在1. 修改SystemUI中有說過,這里就不重復(fù)了。直接上代碼:
1.在AndroidManifest.xml中聲明相應(yīng)的權(quán)限
<uses-permission android:name="android.permission.STATUS_BAR"/> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
網(wǎng)上有文章說要聲明
android : sharedUserId="android.uid.system"
親自測試沒有加上面這行代碼,也是可以使用的。
2. 在Activity中的引用
@Override
protected void onResume() {
super.onResume();
StatusBarManager statusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
statusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
}
@Override
protected void onPause() {
super.onPause();
StatusBarManager statusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
statusBarManager.disable(StatusBarManager.DISABLE_NONE);
}
1.是使用系統(tǒng)簽名,編譯為系統(tǒng)app
java -jar signapk.jar platform.x509.pem platform.pk8 TestDemo.apk TestDemoNew.apk
TestDemoNew.apk就是系統(tǒng)簽名后的apk,然后push到/system/app/目錄下就ok了。關(guān)于簽名的知識就不多說了,可自行找到相關(guān)資料。
下面看下原生系統(tǒng)中電話處理禁止下拉的做法,代碼如下:
路徑:==/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);
}
從這個方法中我們知道系統(tǒng)禁用狀態(tài)欄的方法就是調(diào)用StatusBarManager實現(xiàn)的。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- android 動態(tài)控制狀態(tài)欄顯示和隱藏的方法實例
- Android 去掉狀態(tài)欄的方法匯總
- Android 實現(xiàn)沉浸式狀態(tài)欄的方法
- Android自定義狀態(tài)欄顏色與應(yīng)用標題欄顏色一致
- Android實現(xiàn)的狀態(tài)欄定制和修改方法
- Android 取得狀態(tài)欄、任務(wù)欄高度的小例子
- Android之沉浸式狀態(tài)欄的實現(xiàn)方法、狀態(tài)欄透明
- Android 4.4以上"沉浸式"狀態(tài)欄效果的實現(xiàn)方法
- Android 狀態(tài)欄虛擬導航鍵透明效果的實現(xiàn)方法
- Android編程實現(xiàn)禁止StatusBar下拉的方法
- Android開發(fā)實現(xiàn)應(yīng)用層面屏蔽狀態(tài)欄的方法小結(jié)
相關(guān)文章
Android 藍牙連接 ESC/POS 熱敏打印機打印實例(ESC/POS指令篇)
這篇文章主要介紹了Android 藍牙連接 ESC/POS 熱敏打印機打印實例(ESC/POS指令篇),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
Flutter StreamBuilder組件實現(xiàn)局部刷新示例講解
日常使用最多的局部刷新為Provider狀態(tài)管理 Selector,今天分享flutter框架自帶的StreamBuilder組件,該組件可做到局部刷新,使用簡單且輕便2022-11-11
Android即時通訊設(shè)計(騰訊IM接入和WebSocket接入)
本文主要介紹了Android即時通訊設(shè)計(騰訊IM接入和WebSocket接入),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
Android 用HttpURLConnection訪問網(wǎng)絡(luò)的方法
下面小編就為大家分享一篇Android 用HttpURLConnection訪問網(wǎng)絡(luò)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
android創(chuàng)建optionsmenu的方法
這篇文章主要介紹了android創(chuàng)建optionsmenu的方法,實例分析了Android菜單項的設(shè)置與創(chuàng)建技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
activitygroup 切換動畫效果如何實現(xiàn)
本文將詳細介紹activitygroup 切換動畫效果實現(xiàn)過程,需要聊解的朋友可以參考下2012-12-12
通過Jetpack Compose實現(xiàn)雙擊點贊動畫效果
這篇文章主要介紹了如何利用Jetpack Compose實現(xiàn)雙擊點贊動畫效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-01-01

