在IntentService中使用Toast与在Service中使用Toast的异同
1. 表象
Service中能够正常显示Toast,IntentService中不能正常显示Toast。在2.3系统上,不显示toast,在4.3系统上,toast显示。可是不会消失。
2. 问题分析
查阅Android官方文档能够发现:
Public Constructors
public Toast (Context context)
Construct an empty Toast object. You must call setView(View) before
you can call show().
Parameters
| context | The context to use. Usually your Application or Activity object. |
|---|
从上面能够看出:
Toast要求执行在UI主线程中。所以要想Toast可以正常工作那个必须把它发到UI线程中。
Service执行在主线程中。因此Toast是正常的。
IntentService执行在独立的线程中。因此Toast不正常。
3. 在IntentService中显示Toast
利用Handler,将显示Toast的工作,放在主线程中来做。
详细有两个实现方式。
方法一:Handler的post方式实现,这个方式比較简单。
private void showToastByRunnable(final IntentService context, final CharSequence text, final int duration) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, text, duration).show();
}
});
}
方法二:Handler的msg方式实现,这个方式比較复杂。
Handler msgHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Toast.makeText(ToastIntentService.this,msg.getData().getString("Text"), Toast.LENGTH_SHORT).show();
super.handleMessage(msg);
}
};
private void showToastByMsg(final IntentService context, final CharSequence text, final int duration) {
Bundle data = new Bundle();
data.putString("Text", text.toString());
Message msg = new Message();
msg.setData(data);
msgHandler.sendMessage(msg);
}
4. 关于耗时操作
Service中假设有耗时的操作,要开启一个Thread来做。
IntentService是在独立的线程中,所以能够进行一些耗时操作。
5. 考虑AsyncTask与Service的使用差别
假设是全后台的工作。使用Service。结果的提示能够使用Notification。
假设是异步工作,工作结束后须要更新UI,那么最好使用Thread或者AsyncTask。
6. 应用实例
@Override
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
sendList=intent.getStringArrayListExtra("sendList");
String content=intent.getStringExtra("content");
for (String number : sendList)
{
// 创建一个PendingIntent对象
PendingIntent pi = PendingIntent.getActivity(
SendService.this, 0, new Intent(), 0);
SmsManager sManager=SmsManager.getDefault();
// 发送短信
sManager.sendTextMessage(number, null,content, pi, null);
count++;
showMsg("发送给:"+number+"的短信已完毕");
}
// 提示短信群发完毕
showMsg("短信群发完毕");
}
//利用Handler,将显示Toast的工作,放在主(UI)线程中来做
public void showMsg(final String msg) {
// TODO Auto-generated method stub
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(SendService.this,msg,Toast.LENGTH_SHORT).show();
}
});
}
在IntentService中使用Toast与在Service中使用Toast的异同的更多相关文章
- Handler: Service中使用Toast
Handler 的使用在 android App 开发中用的颇多,它的作用也很大,使用 Handler 一般也会使用到多线程,相信大家对 Handler 不会陌生,在这里,重点说一下 android ...
- (原创)在service中定时执行网络操作的几点说明
执行网络操作是耗时操作,即便是在service中也要放到子线程中执行 这里我用到了async-http-client框架来执行异步请求操作 计时用的java原生Timer和TimerTask类 本来这 ...
- Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;
文章介绍了如何在Service中显示悬浮框,在Service中弹出Dialog,在Service中做耗时的轮询操作: 背景需求: 公司的项目现在的逻辑是这样的:发送一个指令,然后3秒一次轮询去查询这个 ...
- 使用Angular CDK实现一个Service弹出Toast组件
在Angular中,官方团队在开发Material组件库的同时,顺手做了一套Component dev kit,也就是在Angular世界中大名鼎鼎的CDK,这套工具包提供了非常多的前端开发的通用功能 ...
- 如何托管ASP.NET Core应用到Windows Service中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...
- angularjs中provider,factory,service的区别和用法
angularjs中provider,factory,service的区别和用法 都能提供service,但是又有差别 service 第一次被注入时实例化,只实例化一次,整个应用的生命周期中是个单例 ...
- Web Service 中返回DataSet结果大小改进
http://www.cnblogs.com/scottckt/archive/2012/11/10/2764496.html Web Service 中返回DataSet结果方法: 1)直接返回Da ...
- 跟我学Windows Azure 四 Cloud Service中的WebRole与WorkRole,及他们之间的通信
Cloud Service 中WebRole就相当与我们的WebSite,而WorkRole相当与我们在服务器上写了个Windows Service,站在高可用的角度上来讲,Cloud Service ...
- JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例
RESTFul Service中如果要注入EJB实例,常规的@Inject将不起作用,在Jboss中,应用甚至都启动不起来(因为@Inject注入失败),解决方法很简单:将@Inject换成@EJB ...
随机推荐
- osx下查看jar文件
jar是java class的打包文件,我们能够将自己的项目打包为jar文件执行,也能够打包后当做第三方包查看,有时候我们须要查看一下一个jar文件里是否还有某个类以及对应的包,我们能够採用下面两种方 ...
- Exif介绍
Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时间等各种和拍摄条件 ...
- Swift Modules for React Native
React Native is an Objective-C application framework that bridges JavaScript applications running in ...
- UrlConnection的代理和返回状态码的问题
今天写了一段代码想在service里访问一个外部网站,在service的方法里写了如下代码 System.setProperty("http.proxyType", "4 ...
- java开发工具之myeclipse调优
-vmargs -Xms512m //堆的最小值-Xmx512m //堆的最大值(两者设置相同,避免运行时的自动扩张)-XX:PermSize=256m //永久代的最小值 -XX:MaxPermSi ...
- write()和prinln()的区别?
输出数字不同: write()输出数字转换为字符,println原样输出. 输出null不同: write()输出引用类型的时候调用的toString转换为String数据,因此如果对象为null那么 ...
- EditPlus正则表达式中英文详解(附常用事例操作)
http://www.cnblogs.com/JustinYoung/articles/editplus_regular_expression.html EditPlus正则表达式中英文详解 \t T ...
- Java虚拟机学习 - 垃圾收集器 (4)
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. Serial(串行GC)收集器 Serial收集 ...
- laravel 5.1 添加第三方扩展库
步骤一:确定你要放第三方库的目录,假设:app/libs,并在该目录下放置类文件common.php.
- python学习笔记011——检查变量类型type()
>>> a = 1 >>> type(a) <class 'int'> >>> b = 1.0 >>> type(b ...