版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么禁止?fàn)顟B(tài)欄下拉
Android中怎么禁止?fàn)顟B(tài)欄下拉,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面在下將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。1.修改SystemUI路徑:==/frameworks/base/packages/SystemUI//src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java==通過在PhoneStatusBar.java類中注冊(cè)一個(gè)廣播的方式來實(shí)現(xiàn)狀態(tài)欄的禁用和解除,其核心方法就是調(diào)用了disable()方法。disable()是SystemUI自定義的方法,感興趣的同學(xué)可以去看其具體實(shí)現(xiàn)。下面來看下我們?cè)赟ystemUI中的具體實(shí)現(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)注冊(cè)好了,那么看下我們?cè)贏PP中的具體調(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方法實(shí)現(xiàn)狀態(tài)欄的禁用和解除禁用。另:StatusBarManager是一個(gè)隱藏類,所以調(diào)用的時(shí)候可能導(dǎo)入不了包會(huì)報(bào)錯(cuò),最簡(jiǎn)單的方法就是之間用數(shù)值替換,下面列出對(duì)應(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的同學(xué)之間使用其數(shù)值是一樣的。如果有源碼的朋友,可以使用系統(tǒng)編譯的后frameworkjar包作為APP的lib就可以直接使用StatusBarManager方法了。其路徑為/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar。將classes.jar改為framework.jar導(dǎo)入工程就OK了。通過上面的步驟我們知道最關(guān)鍵的就是調(diào)用PhoneStatusBar中disable()方法,我們這里是以廣播的方式實(shí)現(xiàn)的,任何有新方法的同學(xué)可以腦洞大開,只要能實(shí)現(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的方法中增加一個(gè)判斷函數(shù)isGestureIsolated()用于判斷是否支持其對(duì)應(yīng)的手勢(shì)操作。在這里特別說明一下,在網(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()這種方式做判斷的時(shí)候,獲取到的win不一定是當(dāng)前activity的,有時(shí)候是statusbar的,所以這樣的效果不是很好,經(jīng)常會(huì)下拉出狀態(tài)欄,于是就有了Settings.System.getInt(mContext.getContentResolver(),"status_bar_disabled",
0)
==
1;做判斷的方法,用這種方式有一個(gè)好處就是非常直接,需要它禁止下拉的時(shí)候,就調(diào)用Settings.System.putInt(getContentResolver(),
"status_bar_disabled",
1);就OK了,解除禁止的時(shí)候調(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增加一個(gè)標(biāo)志的判斷,但這種實(shí)現(xiàn)的效果也不是很好,還是會(huì)出現(xiàn)下拉能拉下來的情況。綜上所敘,修改PhoneWindowManager實(shí)現(xiàn)禁止下拉的方法還是在SystemGesturesPointerEventListener.Callbacks中增加一個(gè)內(nèi)部方法,這個(gè)內(nèi)部方法使用標(biāo)志位的形式來判斷是否支持狀態(tài)欄下拉。3.使用StatusBarManager中方法因?yàn)镾tatusBarManager是隱藏方法,所以要在IDE中直接使用的話要導(dǎo)入frameworkjar包,怎么找到frameworkjar在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"親自測(cè)試沒有加上面這行代碼,也是可以使用的。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)appjava
-jar
signapk.jar
platform.x
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度水電工程建設(shè)項(xiàng)目施工許可申請(qǐng)服務(wù)合同3篇
- 2024年更新:勞動(dòng)合同簽訂材料速查指南3篇
- 2024年度商業(yè)攝影人才培養(yǎng)合作合同3篇
- 2024年企事業(yè)單位安全檢查服務(wù)外包合同文本5篇
- 2024年度物流服務(wù)合同:某電商企業(yè)與物流公司之間的服務(wù)合同3篇
- 2024版農(nóng)村土地流轉(zhuǎn)及農(nóng)業(yè)設(shè)施租賃合同樣本3篇
- 2024年一次性購房現(xiàn)金合同3篇
- 2024年商品住宅房認(rèn)購合同書(智能家居系統(tǒng)智能洗衣)3篇
- 2024年某城市道路拓寬土石方工程承包合同版B版
- 2024年度股權(quán)并購與整合業(yè)務(wù)合同3篇
- 人教版(2024)數(shù)學(xué)七年級(jí)上冊(cè)期末測(cè)試卷(含答案)
- 2024-2030年中國建筑設(shè)計(jì)產(chǎn)業(yè)應(yīng)用現(xiàn)狀與發(fā)展研究分析報(bào)告
- 大部分分校:地域文化形考任務(wù)三-國開(CQ)-國開期末復(fù)習(xí)資料
- 《大學(xué)生工匠精神及培養(yǎng)研究》
- 二零二四年物流園區(qū)建設(shè)合作協(xié)議
- 醫(yī)療機(jī)構(gòu)輿情應(yīng)急處置預(yù)案
- 中國計(jì)量大學(xué)《數(shù)據(jù)科學(xué)導(dǎo)論》2022-2023學(xué)年第一學(xué)期期末試卷
- 第六單元《平移、旋轉(zhuǎn)和軸對(duì)稱》-2024-2025學(xué)年三年級(jí)數(shù)學(xué)上冊(cè)單元測(cè)試卷(蘇教版)
- OECD -二十國集團(tuán) 經(jīng)合組織公司治理原則2023
- 2024年廣東省深圳市33校聯(lián)考中考英語一模試卷
- 新版標(biāo)準(zhǔn)日本語.中級(jí)單詞
評(píng)論
0/150
提交評(píng)論