博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Java Framework显示Toast(无Activity和Service)
阅读量:6407 次
发布时间:2019-06-23

本文共 1814 字,大约阅读时间需要 6 分钟。

hot3.png

    最近遇到一个问题是如何在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();}
由于这种做法有点小技巧,不大容易想到,因此记录在此,供大家查看。

转载于:https://my.oschina.net/shaorongjie/blog/146566

你可能感兴趣的文章
FindBugs工具常见问题
查看>>
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>
java多线程系列5-死锁与线程间通信
查看>>
数据库分库分表
查看>>
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
linux包之diff
查看>>
spring事务学习(转账案例)(二)
查看>>
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>