IntentService_逍遥-无忌的博客-程序员秘密

技术标签: 异步  Android四大组件之一Service  执行完停止  

服务中的代码都是默认运行在主线程当中的,如果直接在服务里去处理一些耗时的逻辑,就很容易出现ANR(Application Not Responding)的情况。
所以这个时候就需要用到Android多线程编程的技术了,我们应该在服务的每个具体的方法里开启一个子线程,然后在这里去处理那些耗时的逻辑。因此,一个比较标准的服务就可以写成如下形式:

public class MyService extends Service {
    
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
// 处理具体的逻辑
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
}

但是,这种服务一旦启动之后,就会一直处于运行状态,必须调用stopService()或者stopSelf()方法才能让服务停止下来。所以,如果想要实现让一个服务在执行完毕后自动停止的功能,就可以这样写:

public class MyService extends Service {
    
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
// 处理具体的逻辑
stopSelf();
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
}

虽说这种写法并不复杂,但是总会有一些程序员忘记开启线程,或者忘记调用stopSelf()方法。为了可以简单地创建一个异步的、会自动停止的服务,Android专门提供了一个IntentService类,这个类就很好地解决了前面所提到的两种尴尬,下面我们就来看一下它的用法。

public class MyIntentService extends IntentService {
    
public MyIntentService() {
super("MyIntentService"); // 调用父类的有参构造函数
}
@Override
protected void onHandleIntent(Intent intent) {
// 打印当前线程的id
Log.d("MyIntentService", "Thread id is " + Thread.currentThread(). getId());
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyIntentService", "onDestroy executed");
}
}

这里首先是要提供一个无参的构造函数,并且必须在其内部调用父类的有参构造函数。然后要在子类中去实现onHandleIntent()这个抽象方法,在这个方法中可以去处理一些具体的逻辑,而且不用担心ANR的问题,因为这个方法已经是在子线程中运行的了,这个服务在运行结束后应该是会自动停止的。

activity中启动该服务

Intent intentService = new Intent(this, MyIntentService.class);
startService(intentService);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yy471101598/article/details/48652029

智能推荐

使用idea 打jar包_idea java文件打成jar包_逍遥子_的博客-程序员秘密

原文参考:https://blog.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/?spm=a2c4g.11186623.2.10.aRzTRi1.选择"file"=>"Project Structure"2.依次选择"Artifacts" => "+" => "jar" =>  "From modules with dependen

SSL通信原理及Tomcat SSL双向配置_xiejin2008的博客-程序员秘密

SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................................................................................. 12 SSL(Server Socket Layer)简介 ...

Spring Boot 自定义starter_weixin_33909059的博客-程序员秘密

一、简介SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。即使是这样,springboot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。二、如何自定义starter1.实例如何编写自动配...

S5PV210开发 -- I2C 你知道多少?(三)_no i2c-bus specified_聚优致成的博客-程序员秘密

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78835639I2C部分已经接近尾声了,接下来我们回过头来看一下剩下的一些小知识点。如 I2C 仲裁、Linux I2C 工具查看配置I2C设备、什么是漏极开路等等。一、动手画出I2C时序图看了那么多东西,都记不牢的或者理解不透。只有亲自画出时序图,你才能明白的。...

currentstyle和getComputedStyle兼容问题_weixin_33774308的博客-程序员秘密

currentStyle:获取计算后的样式,也叫当前样式、终于样式。长处:能够获取元素的终于样式,包含浏览器的默认值,而不像style仅仅能获取行间样式,所以更经常使用到。注意:不能获取复合样式如background属性值,仅仅能获取单一样式如background-color等。alert (oAbc.currentStyle);很遗憾的是,这个好使的东西也不能被各...

【漏洞复现】海洋CMS6.28远程代码执行_海洋cms漏洞_独角授的博客-程序员秘密

【漏洞复现】海洋CMS6.28远程代码执行文章目录【漏洞复现】海洋CMS6.28远程代码执行一、漏洞背景二、漏洞原理三、漏洞复现一、漏洞背景海洋影视管理系统(seacms,海洋cms)是一套专为不同需求的站长而设计的视频点播系统,灵活,方便,人性化设计简单易用是最大的特色,是快速架设视频网站首选,只需5分钟即可建立一个海量的视频讯息的行业网站。该CMS6.28版本存在命令执行漏洞,攻击者可以通过远程命令执行入侵被攻击者主机。二、漏洞原理area参数处理过的地方经过字符是否非法判断之后,调用ech

随便推点

jquery validate api_erpzhuce的博客-程序员秘密

jQuery.validate.js API Name Type validate( options ) Returns: Validator 验证所选的FORM valid( ) Returns: Boolean 检查是否验证通过 rules( ) Returns: Options 返回元素的验证规则 rules( "add", ...

Halcon算子总结_halcon union算子_在云端821的博客-程序员秘密

union1(ConnectedRegions, RegionUnion)它是将所有区域变成一个整体,选择一个即为所有,和算子connection()作用相反union2(ConnectedRegions, RegionUnion)它是将两个区域合并成一个整体,仅限两个difference()去两个区域的差分,即一个区域减去另一个区域得到一个新的区域。...

Android系统system文件夹结构的说明 \system下的app、lib、bin、etc、fonts、framework_安卓system文件里的系统桌面是什么_Tan.]der的博客-程序员秘密

\system\app 这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是/data/文件夹中\system\app\AlarmClock.apk 闹钟\system\app\AlarmClock.odex\system\app\Browser.apk 浏览器\system\app\Browser.odex\system\app\Bugreport.apk Bug报告\system\app\Bug

服务器面试宝典(转)_cary516843761的博客-程序员秘密

转载自 https://github.com/CyC2018/Backend-Interview-Guide/blob/master/doc/%E4%B8%80%E6%96%87%E5%B8%AE%E4%BD%A0%E7%90%86%E6%B8%85%E9%9D%A2%E8%AF%95%E7%9F%A5%E8%AF%86%E7%82%B9.md . 前言面试考察的知识点多而杂,要完全掌...

mainframe计算机英语,mainframe是什么意思_mainframe怎么读_mainframe翻译_用法_发音_词组_同反义词_(大型电脑的)主机_中央处理机-新东方在线英语词典..._Snow668的博客-程序员秘密

词组短语mainframe computer大型计算机;主机电脑双语例句用作名词(n.)These were the so-called mainframe machines.它们被称为主机。These terminals are connected to our mainframe computer.这些终端设备都和我们的计算机主机相连。It only uses the excess capac...

用Java实现基于XML的购物车_sunshy511的博客-程序员秘密

 购物车是电子商务网站中不可缺少的组成部分,但目前大多数购物车只能作为一个顾客选中商品的展示,客户端无法将购物车里的内容提取出来满足自己事务处理的需要,而这一点在有些电子商务活动中很有必要。XML的出现使得网络上传输的数据变得有意义起来,我们可以根据不同的要求以不同的样式将一个购物车的内容显示出来本文将详细分析一个由Java实现的基于XML的购物车。下面是一个包含了五件商品的购物车的XML内在...

推荐文章

热门文章

相关标签