Android Java Framwork显示Toast(无Activity和Service
来源:互联网 发布:大屏幕控制软件 供应商 编辑:程序博客网 时间:2024/04/30 10:56
临时方案的做法是写一个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();}
由于这种做法有点小技巧,不大容易想到,因此记录在此,供大家查看。
- Android Java Framwork显示Toast(无Activity和Service
- Android Java Framework显示Toast(无Activity和Service)
- Android Java Framework显示Toast(无Activity和Service)
- Android Java Framework显示Toast(无Activity和Service)(转载)
- android service组件上显示toast插件
- Android学习-Service中显示Toast
- android service组件上显示toast插件
- Android开发之Service和IntentService中显示Toast的区别
- Android:Toast在Service组件中实现其显示功能
- Android 自定义Toast,修改Toast样式和显示时长
- Android 自定义Toast,修改Toast样式和显示时长
- Service和IntentService中显示Toast的区别
- Service和IntentService中显示Toast的区别
- Service和IntentService中显示Toast的有什么区别
- Android的Activity和Service
- Android Service和Activity通信
- Android中Toast的显示和分类
- How to show a toast in Android Framework service. 如何在Framework层显示toast.
- java(20130802)Set:HashSet TreeSet、Map(接口):HashTable Hashmap、比较list set map
- 非常有意思的几个算术、算法题
- JQuery Tutorial | AJAX Load
- linux内核编译时的错误
- SWF文件的混淆
- Android Java Framwork显示Toast(无Activity和Service
- Maven实战_Eclipse构建Maven项目
- ubuntu12.04开启Framebuffer
- 结合领域驱动设计的SOA分布式软件架构
- 理解Git——Branch(分支)
- Understanding imports and PYTHONPATH
- Android 权限清单
- POJ 1739 Tony's Tour 解题报告(插头DP)
- java(20130805)迭代器、资源文件、国际化、、I/O流