android tv 悬浮窗口,android TV的自定义关机弹出框
關(guān)機的時候會走power的相關(guān)部分
首先我們監(jiān)聽power鍵的文件是在frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
監(jiān)聽的函數(shù)是interceptKeyBeforeQueueing()
這個也是監(jiān)聽我們keyevent其他按鍵攔截的位置。
我們知道按鍵按下的時候有down事件和up事件
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
我們在上面先聲明一個down的事件,避免我們需要的功能執(zhí)行兩次。
首先我們使用private int powernum = 0;來記錄次數(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)機的彈出框。
第一種是普通的dialog的引用,需要按確定鍵來關(guān)機
第二種是兩次power鍵進行關(guān)機,按任意鍵取消dialog
按一下power我們對powernum進行一次記錄。
SystemProperties.getBoolean("mstar.powertwo.enable",false))類似于一個屬性
當(dāng)它為真的時候,就是兩次power鍵關(guān)機。否的時候就是按一下power
為了方便發(fā)送按兩次關(guān)機走不同的函數(shù),我通過發(fā)送message的值來進行區(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;的時候會執(zhí)行mWindowManagerFuncs.shutdown(true);
當(dāng)發(fā)送message.what=2; ?會執(zhí)行mWindowManagerFuncs.shutdown(false);
這里shutdown()的函數(shù)就是我們的關(guān)機彈出框。
messgae.what=1的時候,我們顯示這個dialog。
dialog在我們的ShutdownThread.java類里面
shutdown()的函數(shù)的文件位置:
frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java
下面的截圖是跟著上面的代碼,這里順便把framework層的獲取string的int值也將一下。
context.getResources().getInteger()
使用這個可以獲取framework的string。因為我按兩次關(guān)機的時候問題提示的信息不同,所以需要在framework添加新的string文字。
我這里添加的兩個類在
frameworks\base\core\res\res\values\symbols.xml
frameworks\base\core\res\res\values\strings.xml
因為不需要添加id所以只需要添加這兩個地方,可以參考里面其他string的寫法。
因為我還不會使用代碼的應(yīng)用,┭┮﹏┭┮ ?只能這樣子去截圖,讀者辛苦一下吧。
這個部分的代碼可以在源碼中找到,源碼是最好的老師
這個部分是區(qū)分dialog的地方,其實還有更好的解決方法的,我這里使用的最快的方法。
這里有個重點就是把dialog設(shè)置成全局dialog,不然會報錯
sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
這個上面這個是必須要的,不要就會報錯。
之后我寫了連個回調(diào)方法來進行區(qū)分,如果是需要按兩次power進行關(guān)機的時候,當(dāng)dialog是顯示的時候powercencle=true ? 默認為false。然后在PhoneWindowManager.java那邊就行判斷,然后在調(diào)用powerdialog的這個方法來把dialog進行取消。
這里我還對dialog進行了一個優(yōu)化,把dialog的高為默認的,但是它的寬,我自己得到了屏幕的寬度然后在除以的2。這個部分的代碼可以如果不需要可以去刪除。
總結(jié):power的彈出框
相當(dāng)于發(fā)送一個消息來進行顯示dialog,然后在按確定的時候走關(guān)機的函數(shù)。
兩次power鍵關(guān)機,相當(dāng)于記錄power鍵的次數(shù)。當(dāng)為2的時候就走關(guān)機的流程。
總結(jié)
以上是生活随笔為你收集整理的android tv 悬浮窗口,android TV的自定义关机弹出框的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android使用桢布局,Android
- 下一篇: html中加载解析,HTML页面加载和解