国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 系統 > 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();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产免费福利网站| 在线免费看黄| 999国产在线视频| 国产三级在线| 在线色视频网| 日本啊v在线| 国产中文字幕网| 国产小视频免费在线观看| 国产精品爱久久久久久久小说| 国产精品蜜臀| h网站免费在线观看| 激情六月婷婷| 91美女主播在线视频| 爱福利在线视频| 国产特级毛片| 美女国产在线| 91视频黄色| 四虎成人精品在永久免费| 超碰人人在线| 91在线视频免费看| 国产麻豆精品视频一区二区| 中文字幕av在线| 福利视频网站导航| 亚洲久草视频| 国产精品白浆视频免费观看| 久久久久久久久免费视频| 国产精品入口麻豆电影| 成视频年人免费看黄网站| 在线国产1区| 国产高清免费在线播放| 黄色av网站在线| 男人天堂v视频| 91涩漫在线观看c| 国产呻吟对白刺激无套视频在线| 精品中文字幕不卡在线视频| 日本福利在线| 青青草免费观看免费视频在线| 国产成人亚洲综合小说区| 午夜国产福利在线| 久久国产情侣| 另类综合图区| 成年人在线观看| 天天操天天艹| 国产三级在线| 在线免费观看高清视频色| 精品一区二区三区高清免费不卡| 国产精品186在线观看在线播放 | 亚洲午夜久久久久中文字幕| 国产精品视频福利一区二区| 国产精品入口麻豆完整版| 中文字幕乱在线伦视频乱在线伦视频| 黄色av电影在线播放| 日本a级黄色| 国产中文字幕在线视频| 成人免费一区二区三区牛牛 | 国产美女在线一区二区三区| 六月天色婷婷| 尤物在线视频| 国产成a人亚洲精v品| 97操碰视频| sese在线视频| 国产午夜三区视频在线| 91麻豆精品国产91久久| 色综合久久五月天| 国产一二区视频| 四虎国产精品永久| 午夜av在线免费观看| 精品街拍一区二区| 天堂中文在线观看| 国产乱子伦三级在线播放| 精品亚洲综合| 国产美女av在线| 樱花草在线观看www| 国产免费高清| 日韩a视频在线观看| 国产亚洲精品一区二区在线观看| 中文乱码字幕高清在线观看| 久久五月精品中文字幕 | 麻豆网站在线免费观看| 国产黄色网页| 尤物网站在线| free性亚洲| 国产高清一级片| 好吊日视频在线观看| 亚洲sss视频| 精品剧情v国产在线观看| 91sp网站在线观看入口| 亚洲videos| 国产激情二区| 国产精品美女一区二区三区四区| 久久久久久91精品色婷婷| 精品国产99久久久久久| 国产三级视频在线播放线观看| 激情丁香在线| 开心丁香婷婷深爱五月| 四虎免费视频| 91精品专区| 亚洲精品天堂在线观看| 国产精品久久久精品a级小说| 九九热在线观看视频| 欧美另类在线视频| av中文字幕在线看| 亚洲精品影视在线| 日本一二三区视频免费高清| av日韩国产| 亚洲国产aⅴ精品| 亚洲免费网站在线观看| 在线国产91| 女人色在线免费视频| 欧美精品小视频| 九九热精品在线视频| 九九热视频免费观看| 国产乱视频在线观看| 国产女人在线观看| 国产亚洲精品午夜高清影院| 国产黄色免费网站| 在线激情网站| 99视频资源网| 国产成+人+亚洲+欧美+综合| 在线免费日韩| 美女被人操视频在线观看| 国内精品一区视频| 国产不卡视频| 麻豆网站在线免费观看| 中文字幕不卡免费视频| 精品一二三四| 免费看av大片| 国产一级黄色| 欧美日韩视频精品二区| 国产三级在线播放| 四虎久久影院| 国产二区三区四区| 麻豆av电影在线观看| 日日夜夜中文字幕| 亚洲人成电影| 国产丝袜护土调教在线视频| 日本在线天堂| 9999在线视频| 国产美女在线看| 在线观看的av| 中文字幕在线视频不卡| 依依成人在线| 最近中文av字幕在线中文| 97视频在线| 国产精品久久久精品a级小说| 久久av少妇| а√天堂8资源在线官网| 国产不卡精品一区二区三区| 成网站在线观看人免费| 欧美午夜电影一区二区三区| av免费在线观看网站| 国产人成网在线播放va免费| 国产麻豆一区二区三区精品| 欧美日韩在线视频免费观看| 亚洲欧洲成人| 亚洲最新永久在线观看| 国产丝袜精品丝袜| 中文字幕在线视频免费观看| 国产精品外围在线观看| 欧美色欧美亚洲另类二区精品| 亚洲电影先锋| 午夜影院在线| 激情在线视频播放| 国产专区在线| 综合激情亚洲| 国产youjizz在线| 精品电影在线| 四虎成人欧美精品在永久在线| 波多野结衣中文字幕久久| 牛牛在线精品视频| 最近高清中文在线字幕在线观看| 丁香花视频在线观看| 午夜免费福利在线观看| 国产精品视频一区二区图片| 精品国产免费第一区二区| 精品伦理一区二区| 天天干天天摸| 国产乱妇乱子| 精精国产xxxx视频在线中文版| 亚洲精品手机在线| 狠狠干五月天| 国产精品麻豆一区二区三区| av日韩在线免费| 丁香婷婷激情| 91麻豆福利| 成人免费一区二区三区牛牛| 国产一区二区三区福利| 99热99re6国产在线播放| 女人色在线免费视频| 国产亚洲依依| 人人澡人人爽| 国产精品777一区二区| 亚洲日本一区二区三区在线观看| 激情丁香久久| 在线午夜视频| 国产免费av网站| 亚洲电影先锋| 国产精品国精产品一二| 免费在线黄色av| av网址在线播放|