一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android Java Framework顯示Toast(無Activity和Servi...

 lifei_szdz 2013-09-28

Android Java Framework顯示Toast(無Activity和Service)

9人收藏此文章, 我要收藏 發(fā)表于2個月前(2013-07-23 22:16) , 已有137次閱讀 ,共0個評論

    最近遇到一個問題是如何在Android Framework中顯示一個提示信息Toast。 從網(wǎng)上查了一下資料,但提供的都是有Activity或者Service的情況。但我的需求是要在一個沒有Activity或者Service的Java文件中去顯示一個Toast。怎么辦呢?因為要創(chuàng)建一個Toast就需要Context,怎樣獲取一個Context呢?苦思冥想沒有找到方法。無奈之下,就先找了一種臨時方案。

   臨時方案的做法是寫一個Service,在這個Service中加個提供顯示Toast的接口。將這個Service注冊到ServiceManager中。然后通過ServiceManager去獲取這個Service,調(diào)用這個Service的接口去顯示Toast。這種寫法雖然有效,但感覺很不方便。因為后面有人又遇到這個問題。

  后來在Android的源代碼中發(fā)現(xiàn)ActivityThread.currentApplication()可以返回一個Application。通過Application.getApplicationContext()可以獲取一個Context??雌饋硎强尚械摹5珜嶋H試的時候發(fā)現(xiàn)ActivityThread.currentApplication()返回為null。怎么辦呢?通過分析ActivityThread的代碼發(fā)現(xiàn)如果是在非UI thread里面調(diào)用,因為這個時候ActivityThread調(diào)用currentActivityThread返回為null.因此為null.

1public static Application currentApplication() {
2        ActivityThread am = currentActivityThread();
3        return am != null ? am.mInitialApplication : null;
4    }

悲劇啊,剛好那支Java文件的API都是運行在非UI thread里面的。那有沒有辦法讓這段代碼運行在UI thread里面呢?

于是苦逼的繼續(xù)查找,終于找到一種方法:

1.通過Looper.getMainLooper()獲取到main looper。在創(chuàng)建一個Handler,在創(chuàng)建Handler的時候?qū)ain looper傳遞給Handler.這樣就可以使這個Handler運行在UI thread中。

2.在Handler的handleMessages()中去調(diào)用ActivityThread.currentApplication()獲取Application。再通過Application.getApplicationContext()獲取到Context。然后創(chuàng)建Toast,顯示。

3.通過Handler.sendMessage的方式去通知Handler顯示一個Toast。

測試,大功告成。

附代碼:

01public void connect() {
02    Looper looper = Looper.getMainLooper();
03    mHandler = new Handler(looper);
04    Message message = mHandler.obtainMessage(SHOW_TOAST);
05    mHandler.sendMessage(m);
06}
07 
08public void handleMessage(Message msg) {
09    switch(msg.what) {
10        case SHOW_TOAST:
11            showToast();
12            return;        
13}
14 
15public void showToast() {
16    Application application = ActivityThread.currentApplication();
17    Toast.makeText(application.getApplicationContext(), "test test test .....", Toast.LENGTH_SHORT).show();
18}
由于這種做法有點小技巧,不大容易想到,因此記錄在此,供大家查看。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩欧美国产亚洲一区| 91久久精品在这里色伊人| 国产传媒欧美日韩成人精品| 亚洲av又爽又色又色| 久久精品免费视看国产成人| 欧美激情一区=区三区| 亚洲香艳网久久五月婷婷| 日本男人女人干逼视频| 久久亚洲国产视频三级黄| 91午夜少妇极品福利| 亚洲日本加勒比在线播放| 日本高清一区免费不卡| 美女极度色诱视频在线观看| 亚洲中文字幕亲近伦片| 亚洲另类欧美综合日韩精品| 日本欧美三级中文字幕| 亚洲精品国男人在线视频| 婷婷伊人综合中文字幕| 亚洲一区二区三区四区性色av | 日韩午夜老司机免费视频| 亚洲国产黄色精品在线观看| 国产精品视频第一第二区| 色一情一乱一区二区三区码| 国产av大片一区二区三区| 97人妻精品一区二区三区男同| 国产无摭挡又爽又色又刺激| 中文字幕五月婷婷免费| 日韩精品区欧美在线一区| 国产伦精品一区二区三区高清版| 粉嫩国产一区二区三区在线| 偷拍洗澡一区二区三区| 日本午夜精品视频在线观看| 久久精品一区二区少妇| 亚洲欧美黑人一区二区| 九九热最新视频免费观看| 伊人国产精选免费观看在线视频| 欧美av人人妻av人人爽蜜桃 | 欧美区一区二区在线观看| 精品欧美国产一二三区| 91精品国产综合久久福利| 国产麻豆成人精品区在线观看|