亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發技巧之永不關閉的Toast信息框(長時間顯示而非系統關閉)

2020-04-11 12:32:42
字體:
來源:轉載
供稿:網友
Toast信息提示框之所以在顯示一定時間后會自動關閉,是因為在系統中有一個Toast隊列。系統會依次從隊列中?。ǔ鲫犃校┮粋€Toast,并顯示它。在顯示一段時間后,再關閉,然后再顯示下一個Toast信息提示框。直到Toast隊列中所有Toast都顯示完為止。那么有些時候需要這個Toast信息提示框長時間顯示,直到需要關閉它時通過代碼來控制,而不是讓系統自動來關閉Toast信息提示框。不過這個要求對于Toast本身來說有些過分,因為Toast類并沒有提供這個功能。雖然如此,但方法總比問題多。通過一些特殊的處理還是可以實現這個功能的,而且并不復雜。

從7.3.1節的內容可以知道,Toast信息提示框需要調用Toast.show方法來顯示。下面來看一下show方法的源代碼。
復制代碼 代碼如下:

publicvoidshow(){
if(mNextView==null){
thrownewRuntimeException("setViewmusthavebeencalled");
}
INotificationManagerservice=getService();
Stringpkg=mContext.getPackageName();
TNtn=mTN;
try{
//將當前Toast加入到Toast隊列
service.enqueueToast(pkg,tn,mDuration);
}catch(RemoteExceptione){
//Empty
}
}

show方法的代碼并不復雜,可以很容易找到如下的代碼。
復制代碼 代碼如下:

service.enqueueToast(pkg,tn,mDuration);

從上面的代碼可以很容易推斷出它的功能是將當前的Toast加入到系統的Toast隊列中??吹竭@里,各位讀者應該想到。雖然show方法的表面功能是顯示Toast信息提示框,但其實際的功能是將Toast加入到隊列中,再由系統根據Toast隊列來顯示Toast信息提示框。那么我們經過更進一步地思考,可以大膽地做出一個初步的方案。既然系統的Toast隊列可以顯示Toast信息提示框,那么我們為什么不可以自己來顯示它呢?這樣不是可以自己來控制Toast的信息提示框的顯示和關閉了嗎!當然,這就不能再調用show方法來顯示Toast信息提示框了(因為show方法會將Toast加入隊列,這樣我們就控制不了Toast了)。

既然初步方案已擬定,現在就來實施它。先在Toast類找一下還有沒有其他的show方法。結果發現了一個TN類,該類是Toast的一個內嵌類。在TN類中有一個show方法。TN是ITransientNotification.Stub的子類。從ITransientNotification和TN類中的show方法初步推斷(因為Transient的中文意思是“短暫的”)系統是從Toast隊列中獲得了Toast對象后,利用TN對象的show方法顯示Toast,再利用TN.hide方法來關閉Toast。首先聲明,這只是假設,我們還不知道這么做是否可行!當然,這也是科學研究的一般方法,先推斷或假設,然后再證明推斷或假設。

現在關鍵的一步是獲得TN對象。遺憾的是TN被聲明成private類型,外部無法訪問。不過別著急。在Toast類中有一個mTN變量。雖然不是public變量,但仍然可以通過反射技術訪問該變量。mTN變量會在創建Toast對象時初始化。因此,只要獲得mTN變量,就獲得了TN對象。下面的代碼顯示了一個永遠不會自動關閉的Toast信息提示框。
復制代碼 代碼如下:

//先創建一個Toast對象
Toasttoast=Toast.makeText(this,"永不消失的Toast",Toast.LENGTH_SHORT);
//設置Toast信息提示框顯示的位置(在屏幕頂部水平居中顯示)
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,0,0);
try
{
//從Toast對象中獲得mTN變量
Fieldfield=toast.getClass().getDeclaredField("mTN");
field.setAccessible(true);
Objectobj=field.get(toast);
//TN對象中獲得了show方法
Methodmethod=obj.getClass().getDeclaredMethod("show",null);
//調用show方法來顯示Toast信息提示框
method.invoke(obj,null);
}
catch(Exceptione)
{
}

上面的代碼中try{…}catch(…){…}語句中的代碼是關鍵。先利用事先創建好的Toast對象獲得了mTN變量。然后再利用反射技術獲得了TN對象的show方法。
關閉Toast和顯示Toast的方法類似,只是需要獲得hide方法,代碼如下:
復制代碼 代碼如下:

try
{
//需要將前面代碼中的obj變量變成類變量。這樣在多個地方就都可以訪問了
Methodmethod=obj.getClass().getDeclaredMethod("hide",null);
method.invoke(obj,null);
}
catch(Exceptione)
{
}

上面的代碼已經很完美地實現了通過代碼控制Toast信息提示框顯示和關閉的功能。但如果想實現得更完美,可以在AndroidSDK源代碼中找一個叫ITransientNotification.aidl的文件(該文件是AIDL服務定義文件,將在后面詳細介紹),并在Android工程的src目錄中建一個android.app包,將這個文件放到這個包中。然后ADT會自動在gen目錄中生成了一個android.app包,包中有一個ITransientNotification.java文件。由于AndroidSDK自帶的ItransientNotification接口屬于內部資源,外部程序無法訪問,因此,只能將從Toast對象中獲得的mTN變量轉換成剛才生成的ITransientNotification對象了。這樣就不需要使反射技術獲得show和hide方法了。經過改良的顯示和關閉Toast信息提示框的代碼如下:
復制代碼 代碼如下:

ITransientNotificationnotification=(ITransientNotification)field.get(toast);
//顯示Toast信息提示框
notification.show();
//關閉Toast信息提示框
notification.hide();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产性色av一区二区| 亚洲天堂视频在线观看| 久色乳综合思思在线视频| 精品国产91久久久久久| 久久久国产成人精品| 日韩高清不卡av| 日韩欧美精品免费在线| 日韩av综合网| 国产精品久久久久久久久久三级| 国产精品白丝jk喷水视频一区| 国产日韩精品在线观看| 亚洲区中文字幕| 久久在线精品视频| 狠狠色狠色综合曰曰| 亚洲人成网站777色婷婷| 欧美日韩成人在线观看| 日韩最新中文字幕电影免费看| 欧美福利视频在线| 亚洲乱码一区av黑人高潮| 91中文字幕在线| 欧美麻豆久久久久久中文| 国产999精品久久久| 国产亚洲欧美视频| 久热在线中文字幕色999舞| 成人免费观看49www在线观看| 亚洲人成网在线播放| 日韩欧美高清在线视频| 国产精品久久激情| 欧美日韩中文字幕在线视频| 欧美大片在线影院| 国产成人免费91av在线| 国产精品99导航| 97精品国产97久久久久久| 久久亚洲精品中文字幕冲田杏梨| 揄拍成人国产精品视频| 国产日韩欧美在线看| 亚洲xxx大片| 亚洲缚视频在线观看| 亚洲二区在线播放视频| 欧美日韩成人在线视频| 欧美制服第一页| 日韩国产在线播放| 国产美女91呻吟求| 国产精品成人品| 2023亚洲男人天堂| 色爱av美腿丝袜综合粉嫩av| 久精品免费视频| 国产啪精品视频网站| 97视频在线观看播放| 亚洲日本中文字幕| 热久久免费国产视频| 久久久精品中文字幕| 亚洲精品电影在线| 欧美午夜精品久久久久久久| 91高清视频免费| 国产国语刺激对白av不卡| 国产第一区电影| 久久精品国产99国产精品澳门| 亚洲第一精品夜夜躁人人躁| 日韩成人在线电影网| 午夜精品久久久久久99热软件| 97精品国产97久久久久久春色| 精品爽片免费看久久| 久久久久久久电影一区| xvideos亚洲人网站| 国产成人av网| 亚洲女同性videos| 国产自产女人91一区在线观看| 久久成人精品一区二区三区| 8x拔播拔播x8国产精品| 欧美疯狂性受xxxxx另类| 亚洲精品免费网站| 日韩在线视频免费观看高清中文| 国产视频精品自拍| 97久久精品国产| 日韩中文字幕在线播放| 亚洲免费av电影| 国产91精品最新在线播放| 亚洲男人av电影| 亚洲精品动漫100p| 欧美视频精品一区| 深夜福利国产精品| 久久国产精品首页| 成人观看高清在线观看免费| 久久精品国产久精国产思思| 亚洲精品久久在线| 97视频网站入口| 久久综合久中文字幕青草| 91高清视频在线免费观看| 欧美富婆性猛交| 日韩欧美精品免费在线| 日韩高清av在线| 成人免费视频网址| 91精品视频在线| 欧美电影在线观看网站| 午夜精品久久久久久久久久久久| 国产不卡在线观看| 国产美女精品免费电影| 色婷婷综合久久久久中文字幕1| 欧美大片免费观看| 欧美激情按摩在线| 国产欧美日韩亚洲精品| 中文字幕精品在线视频| 国产欧美日韩最新| 日韩欧美中文在线| 欧美电影免费观看高清完整| 欧美华人在线视频| 午夜精品一区二区三区视频免费看| 国产成人免费av| 欧美极品欧美精品欧美视频| www.日韩欧美| 在线观看成人黄色| 久久99精品久久久久久噜噜| 欧美一级bbbbb性bbbb喷潮片| 欧美亚洲在线视频| 成人网页在线免费观看| 日韩美女视频免费看| 国产做受高潮69| 国产精品91视频| 精品国产一区久久久| 在线观看日韩欧美| 热久久视久久精品18亚洲精品| 久青草国产97香蕉在线视频| 亚洲的天堂在线中文字幕| 欧美精品一区在线播放| 中文字幕不卡在线视频极品| 亚洲精品福利在线| 亚洲欧美日韩精品久久奇米色影视| 久久久久久成人精品| 欧美猛少妇色xxxxx| 免费91麻豆精品国产自产在线观看| 亚洲女人被黑人巨大进入| 91九色蝌蚪国产| 俺去亚洲欧洲欧美日韩| 日韩精品久久久久久久玫瑰园| 国产精品白丝av嫩草影院| 亚洲欧美日韩综合| 国产婷婷色综合av蜜臀av| 中文字幕亚洲综合| 色综合久久精品亚洲国产| 久久国产精品首页| 精品国产区一区二区三区在线观看| 亚洲色图25p| 成人www视频在线观看| 91精品视频在线| 丁香五六月婷婷久久激情| 欧美一级大片视频| 热门国产精品亚洲第一区在线| 亚洲色图在线观看| 久久99精品久久久久久噜噜| 亚洲精品久久久久中文字幕二区| 久久国产精品视频| 97在线观看视频国产| 伊人久久久久久久久久久久久| 亚洲女人天堂成人av在线| 精品久久久久久中文字幕一区奶水| 亚洲色图综合久久| 欧美高清不卡在线| 国产精品99导航| 裸体女人亚洲精品一区| 亚洲高清在线观看| 日韩av电影国产| 欧美一级黑人aaaaaaa做受| 国产精品视频一区国模私拍|