最近遇到一个问题是如何在Android Framework中显示一个提示信息Toast。 从网上查了一下资料,但提供的都是有Activity或者Service的情况。但我的需求是要在一个没有Activity或者Service的Java文件中去显示一个Toast。怎么办呢?因为要创建一个Toast就需要Context,怎样获取一个Context呢?苦思冥想没有找到方法。无奈之下,就先找了一种临时方案。

   临时方案的做法是写一个Service,在这个Service中加个提供显示Toast的接口。将这个Service注册到ServiceManager中。然后通过ServiceManager去获取这个Service,调用这个Service的接口去显示Toast。这种写法虽然有效,但感觉很不方便。因为后面有人又遇到这个问题。

  后来在Android的源代码中发现ActivityThread.currentApplication()可以返回一个Application。通过Application.getApplicationContext()可以获取一个Context。看起来是可行的。但实际试的时候发现ActivityThread.currentApplication()返回为null。怎么办呢?通过分析ActivityThread的代码发现如果是在非UI thread里面调用,因为这个时候ActivityThread调用currentActivityThread返回为null.因此为null.

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

悲剧啊,刚好那支Java文件的API都是运行在非UI thread里面的。那有没有办法让这段代码运行在UI thread里面呢?

于是苦逼的继续查找,终于找到一种方法:

1.通过Looper.getMainLooper()获取到main looper。在创建一个Handler,在创建Handler的时候将main looper传递给Handler.这样就可以使这个Handler运行在UI thread中。

2.在Handler的handleMessages()中去调用ActivityThread.currentApplication()获取Application。再通过Application.getApplicationContext()获取到Context。然后创建Toast,显示。

3.通过Handler.sendMessage的方式去通知Handler显示一个Toast。

测试,大功告成。

public void connect() {    Looper looper = Looper.getMainLooper();mHandler = new Handler(looper);Message message = mHandler.obtainMessage(SHOW_TOAST);mHandler.sendMessage(m);}public void handleMessage(Message msg) {    switch(msg.what) {        case SHOW_TOAST:            showToast();            return; }public void showToast() {    Application application = ActivityThread.currentApplication();Toast.makeText(application.getApplicationContext(), "test test test .....", Toast.LENGTH_SHORT).show();}




更多相关文章

  1. android Asynctask的优缺点?能否同时并发100+asynctask呢?
  2. Android动态加载字节码
  3. Android的BUG(五)- Android跨进程使用GraphicBuffer的野指针问题
  4. DDMS的使用、内存溢出的调试和模拟器的启动命令参数
  5. Android中的MVP模式使用
  6. Android中activity和xml的第一个项目
  7. Android应用程序资源——menu菜单资源
  8. 中国市场Android终端App兼容性质量报告
  9. 基于JSON RPC的一种Android跨进程调用解决方案了解一下?

随机推荐

  1. Android(安卓)中文 API 文档 (44) ―― Chr
  2. Android(安卓)UI开发第三十三篇——Navig
  3. Android(安卓)xml资源文件中@、@android:
  4. android 缓存Bitmap
  5. [小代码]在Android和PHP之间的加密/解密,
  6. android 使用Intent传递数据之剪切板
  7. Android获取运营商代码
  8. 【Arcgis for android】保存地图截图到sd
  9. android 仿QQ手机版
  10. Android资源汇总贴