Android命令行下運(yùn)行JAVA程序之StatusBar控制

最近在思索著Android命令行下可以執(zhí)行C語言寫的命令行程序(Android是基于Linux的,那么Linux支持的总处,在Android上也是支持的)贤惯,那么Android上層基于JAVA的Dalvik虛擬機(jī)是否也可以讓JAVA程序在命令行下執(zhí)行挠日,答案是肯定的佑刷,我們發(fā)現(xiàn)在Android源碼目錄下的frameworks/base/cmds/目錄下有相應(yīng)的程序弃舒,可將普通的JAVA程序打包成JAR痰娱,讓其運(yùn)行于Dalvik虛擬機(jī)上牍疏,而不是標(biāo)準(zhǔn)的JVM上杖剪。為了對其研究實(shí)踐一番冻押,編寫了如下例子:

Android4.0狀態(tài)欄控制命令:基于Android4.0.4系統(tǒng),需要在源碼環(huán)境下編譯(即需要有Android源碼和編譯環(huán)境)盛嘿,實(shí)現(xiàn)功能有:

1洛巢、控制整個(gè)狀態(tài)欄的顯示、隱藏次兆;

2稿茉、控制BACK、HOME芥炭、RECENT這三個(gè)按鍵的顯示漓库、隱藏;

首先园蝠,我們在Android源碼目錄下的frameworks/base/cmds目錄下創(chuàng)建sbstate目錄(StatusBarState)渺蒿,該目錄下包含Android.mk、sbstate兩文件和src目錄彪薛,其中src目錄下包含了整個(gè)JAVA包的層級目錄及類源碼茂装,其路徑結(jié)構(gòu)為src/com/cmds/xinu/Sbstate.java怠蹂。

Sbstate.java源碼如下:

package com.cmds.xinu;

import android.content.Context;

import android.os.ServiceManager;

import android.os.RemoteException;

import android.view.View;

import com.android.internal.statusbar.IStatusBarService;

public class Sbstate {

public static void main(String[] args) {

(new Sbstate()).run(args);

}

private void run(String[] args){

if (args.length < 1){

showUsage();

return;

}

String command = args[0];

IStatusBarService mBarService;

mBarService = IStatusBarService.Stub.asInterface(

ServiceManager.getService(Context.STATUS_BAR_SERVICE));

if (command.equals("sbvis")){

try {

mBarService.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);//View.STATUS_BAR_VISIBLE

} catch (RemoteException ex) {

}

System.out.println("Status Bar Visible!");

} else if (command.equals("sbdis")){

try {

mBarService.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);//View.STATUS_BAR_HIDDEN

} catch (RemoteException ex) {

}

System.out.println("Status Bar Disable/Unvisible!");

} else if (command.equals("bvis")){

try{

mBarService.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE & ~View.STATUS_BAR_DISABLE_BACK);

} catch (RemoteException ex) {

}

System.out.println("Back button visible!");

} else if (command.equals("bdis")){

try{

mBarService.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);

} catch (RemoteException ex) {

}

System.out.println("Back button Disable/Unvisible!");

} else if (command.equals("hvis")){

try{

mBarService.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE & ~View.STATUS_BAR_DISABLE_HOME);

} catch (RemoteException ex) {

}

System.out.println("Home button visible!");

} else if (command.equals("hdis")){

try{

mBarService.setSystemUiVisibility(View.STATUS_BAR_DISABLE_HOME);

} catch (RemoteException ex) {

}

System.out.println("Home button Disable/Unvisible!");

} else if (command.equals("rvis")){

try{

mBarService.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE & ~View.STATUS_BAR_DISABLE_RECENT);

} catch (RemoteException ex) {

}

System.out.println("Recent button visible!");

} else if (command.equals("rdis")){

try{

mBarService.setSystemUiVisibility(View.STATUS_BAR_DISABLE_RECENT);

} catch (RemoteException ex) {

}

System.out.println("Recent button Disable/Unvisible!");

}

}

private void showUsage(){

System.err.println("Usage:sbstate [sbvis|sbdis|bvis|bdis|hvis|hdis|rvis|rdis]");

System.err.println("? ? ? sbvis:statusbar visible");

System.err.println("? ? ? sbdis:statusbar disable");

System.err.println("? ? ? bvis:back button visible");

System.err.println("? ? ? bdis:back button disable");

System.err.println("? ? ? hvis:home button visible");

System.err.println("? ? ? hdis:home button disable");

System.err.println("? ? ? rvis:recent button visible");

System.err.println("? ? ? rdis:recent button disable");

}

}

該部分源碼都是調(diào)用Android的API,之前一直犯難的是在如何獲取StatusBar相關(guān)對象少态,后來查看了cmds目錄下的其他文件城侧,發(fā)現(xiàn)基本上是通過調(diào)用Interface來獲取實(shí)例,其他都是標(biāo)準(zhǔn)的JAVA語言代碼彼妻。

sbstate文件內(nèi)容如下:

base=/system

export CLASSPATH=$base/framework/sbstate.jar

exec app_process $base/bin com.cmds.xinu.Sbstate $*

該部分內(nèi)容主要是設(shè)置CLASSPATH環(huán)境變量為我們編譯出來的JAR文件嫌佑,即指定了我們的程序位置,Android源碼編譯完后會放至/system/framework目錄下侨歉,接下來使用Linux命令下的exec命令來調(diào)用app_process命令執(zhí)行我們的JAVA程序歧强,其中app_process命令位于源碼目錄下的frameworks/base/cmds/app_process目錄下,其命令的使用方法如下:

Usage: app_process [java-options] cmd-dir start-class-name [options]

其中我們文件里的$base/bin對應(yīng)的是命令所在的目錄为肮,com.cmds.xinu.Sbstate為我們的JAVA代碼的入口類摊册,即main函數(shù)所在的類名,而$*是將命令行輸入的任何參數(shù)傳遞作為main函數(shù)的參數(shù)列表颊艳。

Android.mk文件內(nèi)容:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_MODULE := sbstate

include $(BUILD_JAVA_LIBRARY)

include $(CLEAR_VARS)

ALL_PREBUILT += $(TARGET_OUT)/bin/sbstate

$(TARGET_OUT)/bin/sbstate : $(LOCAL_PATH)/sbstate | $(ACP)

$(transform-prebuilt-to-target)

其中文件是參考其他同目錄下的Android.mk文件茅特,其功能主要是將JAVA文件編譯成JAVA庫JAR文件,并把sbstate文件復(fù)制到目標(biāo)目錄的system/bin目錄下棋枕,我這邊測試時(shí)是手動(dòng)把sbstate文件復(fù)制到/system/bin目錄下白修,此時(shí)需要注意該文件的權(quán)限,不然會有Permission Deny之類的提示重斑。

由于我們放在源碼里編譯兵睛,如果直接這樣mm一下,是會出錯(cuò)的窥浪,我們還需要修改Android源碼的編譯配置祖很,涉及到如下文件:

1、build/core/legacy_prebuilts.mk

對應(yīng)于Android.mk里要用到的prebuilt功能漾脂,主要是把sbstate文件復(fù)制到/system/bin目錄下,不加的話會提示預(yù)編譯失敼歉濉笨鸡;

在文件中修改GRANDFATHERED_ALL_PREBUILT配置項(xiàng),添加上sbstate坦冠。

2形耗、build/core/user_tags.mk

對應(yīng)于Android.mk里要用到的編譯為JAR功能,在文件中修改GRANDFATHERED_USER_MODULES配置項(xiàng)辙浑,添加上sbstate激涤。

至此,整個(gè)編譯配置及源碼就實(shí)現(xiàn)好了例衍,接下來只需要mm一下昔期,復(fù)制或者燒錄一下已卸,就可以在命令行(串口或者ADB)下大膽的敲上sbstate命令,會有如下提示:

Usage:sbstate [sbvis|sbdis|bvis|bdis|hvis|hdis|rvis|rdis]

sbvis:statusbar visible

sbdis:statusbar disable

bvis:back button visible

bdis:back button disable

hvis:home button visible

hdis:home button disable

rvis:recent button visible

rdis:recent button disable

此時(shí)硼一,我們可以輸入如下形式的命令來執(zhí)行相應(yīng)的功能:

1累澡、顯示狀態(tài)欄:sbstate sbvis

2、隱藏狀態(tài)欄:sbstate sbdis

3般贼、顯示BACK按鈕圖標(biāo):sbstate bvis

4愧哟、隱藏BACK按鈕圖標(biāo):sbstate bdis

5、顯示HOME按鈕圖標(biāo):sbstate hvis

6哼蛆、隱藏HOME按鈕圖標(biāo):sbstate hdis

7蕊梧、顯示RECENT按鈕圖標(biāo):sbstate rvis

8、隱藏RECENT按鈕圖標(biāo):sbstate rdis

好了腮介,親手嘗試一下吧肥矢,見證狀態(tài)欄的風(fēng)起云涌,變幻莫測吧叠洗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甘改,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灭抑,更是在濱河造成了極大的恐慌十艾,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腾节,死亡現(xiàn)場離奇詭異忘嫉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)案腺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門庆冕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人救湖,你說我怎么就攤上這事愧杯。” “怎么了鞋既?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耍铜。 經(jīng)常有香客問我邑闺,道長,這世上最難降的妖魔是什么棕兼? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任陡舅,我火速辦了婚禮,結(jié)果婚禮上伴挚,老公的妹妹穿的比我還像新娘靶衍。我一直安慰自己灾炭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布颅眶。 她就那樣靜靜地躺著蜈出,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涛酗。 梳的紋絲不亂的頭發(fā)上铡原,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機(jī)與錄音商叹,去河邊找鬼燕刻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剖笙,可吹牛的內(nèi)容都是我干的卵洗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼弥咪,長吁一口氣:“原來是場噩夢啊……” “哼忌怎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酪夷,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榴啸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晚岭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸥印,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年坦报,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了库说。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡片择,死狀恐怖潜的,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情字管,我是刑警寧澤啰挪,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站嘲叔,受9級特大地震影響亡呵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硫戈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一锰什、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦汁胆、人聲如沸梭姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誉尖。三九已至,卻和暖如春谢谦,著一層夾襖步出監(jiān)牢的瞬間释牺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工回挽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留没咙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓千劈,卻偏偏與公主長得像祭刚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子墙牌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,290評論 25 707
  • afinalAfinal是一個(gè)android的ioc涡驮,orm框架 https://github.com/yangf...
    passiontim閱讀 15,437評論 2 45
  • 實(shí)現(xiàn)輔助(外掛)參考地址:http://developer.android.com/training/access...
    AFinalStone閱讀 1,431評論 0 0
  • “燕子來時(shí)新社捉捅,梨花落后清明”,在喧囂嘈雜的城市是很難見到燕子的虽风,梨花也不像故鄉(xiāng)那般隨處可見棒口、嬌媚可人」枷ィ可是啊无牵,我...
    安木姑娘閱讀 316評論 2 1
  • 1忱辅、男人可以虛懷若谷七蜘,可以低調(diào)行事,可以沉默寡言耕蝉,但絕不可沒有自信崔梗。自信,是撐起男人的骨骼垒在。沒有自信,就沒有男人味...
    樂享薈閱讀 406評論 1 6