日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

android tv 悬浮窗口,android TV的自定义关机弹出框

發(fā)布時(shí)間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android tv 悬浮窗口,android TV的自定义关机弹出框 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)機(jī)的時(shí)候會(huì)走power的相關(guān)部分

首先我們監(jiān)聽(tīng)power鍵的文件是在frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

監(jiān)聽(tīng)的函數(shù)是interceptKeyBeforeQueueing()

這個(gè)也是監(jiān)聽(tīng)我們keyevent其他按鍵攔截的位置。

我們知道按鍵按下的時(shí)候有down事件和up事件

final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;

我們?cè)谏厦嫦嚷暶饕粋€(gè)down的事件,避免我們需要的功能執(zhí)行兩次。

首先我們使用private int powernum = 0;來(lái)記錄次數(shù),下面給出解釋。

if((keyCode==KeyEvent.KEYCODE_POWER)&&(down==true)){

powernum = powernum + 1;

Message message=new Message();

if(SystemProperties.getBoolean("mstar.powertwo.enable",false)){

message.what = powernum;

} else {

message.what = 1;

}

powerhandler.sendMessage(message);

return 0;

}

if(SystemProperties.getBoolean("mstar.powertwo.enable",false)){

if(ShutdownThread.powercencle()){

if((keyCode != KeyEvent.KEYCODE_POWER) && (down == true)){

ShutdownThread.powerdialog();

powernum = 0;

}

}

}

我這里有兩種不同樣式的關(guān)機(jī)的彈出框。

第一種是普通的dialog的引用,需要按確定鍵來(lái)關(guān)機(jī)

第二種是兩次power鍵進(jìn)行關(guān)機(jī),按任意鍵取消dialog

按一下power我們對(duì)powernum進(jìn)行一次記錄。

SystemProperties.getBoolean("mstar.powertwo.enable",false))類(lèi)似于一個(gè)屬性

當(dāng)它為真的時(shí)候,就是兩次power鍵關(guān)機(jī)。否的時(shí)候就是按一下power

為了方便發(fā)送按兩次關(guān)機(jī)走不同的函數(shù),我通過(guò)發(fā)送message的值來(lái)進(jìn)行區(qū)分。

private Handler powerhandler = new Handler(){

public void handleMessage(Message msg) {

switch (msg.what) {

case 1:

mWindowManagerFuncs.shutdown(true);

powernum = 1;

break;

case 2:

mWindowManagerFuncs.shutdown(false);

break;

default:

break;

}

};

};

這里發(fā)送message.what=1;的時(shí)候會(huì)執(zhí)行mWindowManagerFuncs.shutdown(true);

當(dāng)發(fā)送message.what=2; ?會(huì)執(zhí)行mWindowManagerFuncs.shutdown(false);

這里shutdown()的函數(shù)就是我們的關(guān)機(jī)彈出框。

messgae.what=1的時(shí)候,我們顯示這個(gè)dialog。

dialog在我們的ShutdownThread.java類(lèi)里面

shutdown()的函數(shù)的文件位置:

frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java

下面的截圖是跟著上面的代碼,這里順便把framework層的獲取string的int值也將一下。

context.getResources().getInteger()

使用這個(gè)可以獲取framework的string。因?yàn)槲野磧纱侮P(guān)機(jī)的時(shí)候問(wèn)題提示的信息不同,所以需要在framework添加新的string文字。

我這里添加的兩個(gè)類(lèi)在

frameworks\base\core\res\res\values\symbols.xml

frameworks\base\core\res\res\values\strings.xml

因?yàn)椴恍枰砑觟d所以只需要添加這兩個(gè)地方,可以參考里面其他string的寫(xiě)法。

因?yàn)槲疫€不會(huì)使用代碼的應(yīng)用,┭┮﹏┭┮ ?只能這樣子去截圖,讀者辛苦一下吧。

這個(gè)部分的代碼可以在源碼中找到,源碼是最好的老師

這個(gè)部分是區(qū)分dialog的地方,其實(shí)還有更好的解決方法的,我這里使用的最快的方法。

這里有個(gè)重點(diǎn)就是把dialog設(shè)置成全局dialog,不然會(huì)報(bào)錯(cuò)

sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);

這個(gè)上面這個(gè)是必須要的,不要就會(huì)報(bào)錯(cuò)。

之后我寫(xiě)了連個(gè)回調(diào)方法來(lái)進(jìn)行區(qū)分,如果是需要按兩次power進(jìn)行關(guān)機(jī)的時(shí)候,當(dāng)dialog是顯示的時(shí)候powercencle=true ? 默認(rèn)為false。然后在PhoneWindowManager.java那邊就行判斷,然后在調(diào)用powerdialog的這個(gè)方法來(lái)把dialog進(jìn)行取消。

這里我還對(duì)dialog進(jìn)行了一個(gè)優(yōu)化,把dialog的高為默認(rèn)的,但是它的寬,我自己得到了屏幕的寬度然后在除以的2。這個(gè)部分的代碼可以如果不需要可以去刪除。

總結(jié):power的彈出框

相當(dāng)于發(fā)送一個(gè)消息來(lái)進(jìn)行顯示dialog,然后在按確定的時(shí)候走關(guān)機(jī)的函數(shù)。

兩次power鍵關(guān)機(jī),相當(dāng)于記錄power鍵的次數(shù)。當(dāng)為2的時(shí)候就走關(guān)機(jī)的流程。

總結(jié)

以上是生活随笔為你收集整理的android tv 悬浮窗口,android TV的自定义关机弹出框的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。