【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么禁止?fàn)顟B(tài)欄下拉_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么禁止?fàn)顟B(tài)欄下拉_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么禁止?fàn)顟B(tài)欄下拉_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么禁止?fàn)顟B(tài)欄下拉_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么禁止?fàn)顟B(tài)欄下拉_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論