Android:IntentService的学习

Android的四大组件中,Service排行老二,在Android中的主要作用是后台服务,进行与界面无关的操作。由于Service运行在主线程,所以进行异步操作需要在子线进行。为此Android为我们提供了IntentServiceIntentService是一个抽象类,继承至Service,主要方便我们新建工作线程进行异步操作。提交任务到IntentService时,异步任务以串行方式进行处理,意味着工作线程一次只处理一个任务。而且当所有任务都完成之后,会自动停止Service,不需要我们手动停止。

IntentService 的使用

  1. 我们定义DownloadService类并继承至IntentService。来模拟网络下载的过程。
public class DownloadService extends IntentService {private static int count = 0;/*** 主要用于调用服务类构造器** @param name 用于区分不同任务*/public DownloadService(String name) {super(name);}/*** AndroidManifest.xml配置清单需要配置** @param*/public DownloadService() {super("action");}/***主要重写该方法,在该方法内进行异步操作。**/@Overrideprotected void onHandleIntent(Intent intent) {Log.i("Download", "onHandleIntent" + count);count++;String name = intent.getStringExtra("action");if (name.equals("download")) {for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();return;}Log.i("Download", "download:" + count);}}}//以下方法的重写,仅仅为了打印日志@Overridepublic void onDestroy() {super.onDestroy();Log.i("Download", "onDestroy");}@Overridepublic void onCreate() {super.onCreate();Log.i("Download", "onCreate");}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);Log.i("Download", "onStart");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("Download", "onStartCommand");return super.onStartCommand(intent, flags, startId);}
}复制代码
  1. 在AndroidManifest.xml配置DownloadService
<service android:name=".DownloadService"/>
复制代码
  1. 在MainActivity类中循环调用Service,启动多循环任务。
 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent=new Intent(this,DownloadService.class);for (int i =0;i<3;i++){intent.putExtra("action","download");intent.putExtra("count",""+i);startService(intent);}}
复制代码
  1. 运行结果

分析: 从运行结果知道,IntentService在运行多个任务情况下,只调用一次onCreate,调用多次onStartCommand,跟Service的生命周期一致。但,只有在运行完download:1之后才会去运行download:2,接着是download:3。最后所有任务结束后会自动调用onDestroy,停止服务。在这里需要注意的是,和Service并不同,Service需要我们手动停止服务。对于结果的回调,可以采用接口回调,广播,EventBus

那么,IntentService是如何在Service中实现异步操作和串行处理任务的呢?

IntentService内部实现

  1. 查看IntentService的onCreate方法
 @Overridepublic void onCreate() {super.onCreate();//分析一HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();分析二mServiceHandler = new ServiceHandler(mServiceLooper);}
复制代码

分析一

HandThread继承Thread,通过start方法创建工作线程,内部建立Looper来达到消息循环,通过Hanlder消息机制来达到串行的效果和处理多任务。HandThreadHandler消息机制,可以另外查看文章。

分析二

ServiceHandler继承Handler,与普通的Handler并没有区别,在其内容处理handleMessage。即调用IntentServiceonHandleIntent

  private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}}
复制代码
  1. 那么,当我们在Activity中重复调用startService方法时,只会多次调用onStartCommand方法,并不会重复调用onCreate方法。我们看看onStartComamnd方法的实现。
    @Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}
复制代码

可以看得出,调用了onStart方法了。而onStart方法只是将我们的Intent包装成Message,通过Handler发送出去,并在Handler中进行处理,调用我们的onHandleIntent。进而调用我们实现onHandleIntent的代码。

    @Overridepublic void onStart(@Nullable Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);}
复制代码

总结

IntentService并没有什么的新的技术含量,在了解HandlerTread和Handler的消息机制下,对Handler+Thread+Service作一个封装,更适合我们后台进行异步耗时操作的场景。有效避免通过new多个Thread

知识点分享

Android消息机制

HandlerThread必知必会

如果觉得文章有用,给文章点个赞,铁子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能商业大会构造信息化交流平台

在快速发展的当今社会&#xff0c;所有事物都在日新月异地变化着&#xff0c;相较于过去的传统商业的变化速度&#xff0c;现今基于数据的互联网商业变化速度高出了一个量级&#xff0c;同时市场对于企业的应对速度也有了更高的要求&#xff0c;然而面对大体量的数据&#xff0…

itcast-ssh-crm实践

分析 BaseDao 文件上传 转载于:https://www.cnblogs.com/hellowq/p/10209761.html

分类器大牛们

David Lowe&#xff1a;Sift算法的发明者&#xff0c;天才。 Rob Hess&#xff1a;sift的源码OpenSift的作者&#xff0c;个人主页上有openSift的下载链接&#xff0c;Opencv中sift的实现&#xff0c;也是参考这个。 Koen van de Sande&#xff1a;作者给出了sift,densesift,co…

go 成长路上的坑(1)

一、先来看一段代码 package mainimport "fmt"type X struct{}func (x *X) test(){println("h1",x) } func main(){a : X{} a.test()(&X{}).test()(X{}).test() } 猜猜他的结果 二、揭晓答案 package mainimport "fmt"type X struct{}func (…

利用python脚本程序监控文件被修改

需求&#xff1a;利用python编写监控程序&#xff0c;监控一个文件目录&#xff0c;当目录下的文件发生改变时&#xff0c;实现有修改就发报警邮件 邮件使用QQ邮箱&#xff0c;需要开启smtp&#xff0c;使用手机发生短信&#xff0c;腾讯会给你发邮箱密码。如下所示&#xff1a…

Oracle RAC

环境如下&#xff1a; Linux操作系统&#xff1a;Centos 6.5 64bit &#xff08;这个版本的redhat 6内核等OS在安装grid最后执行root.sh时会出现crs-4124&#xff0c;是oracle11.2.0.1的bug&#xff09; VMware version&#xff1a;Workstation 8.0.3 build-703057 Oracle…

好程序员web前端分享MVVM框架Vue实现原理

好程序员web前端分享MVVM框架Vue实现原理&#xff0c;Vue.js是当下很火的一个JavaScript MVVM库&#xff0c;它是以数据驱动和组件化的思想构建的。相比于Angular.js和react.js更加简洁、更易于理解的API&#xff0c;使得我们能够快速地上手并使用Vue.js。​1.什么是MVVM呢&…

HDU - 3516 Tree Construction

HDU - 3516 思路&#xff1a; 平行四边形不等式优化dp &#xff1a;&#xff09; 代码&#xff1a; #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc.h> using namespace std; #define y1 y11 #define fi first #define se…

各类总线传输速率

1. USB总线 USB1.1&#xff1a; -------低速模式(low speed)&#xff1a;1.5Mbps -------全速模式(full speed)&#xff1a; 12Mbps USB2.0&#xff1a;向下兼容。增加了高速模式&#xff0c;最大速率480Mbps。 -------高速模式(high speed)&#xff1a; 25~480Mbps US…

Activiti多人会签例子

Activiti中提供了多实例任务&#xff08;for-each&#xff09;将多实例应到到UserTask中可以实现会签功能。 Multi-instance (for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming …

Django 【认证系统】auth

本篇内容 介绍Django框架提供的auth 认证系统 方法&#xff1a; 方法名 备注 create_user 创建用户 authenticate 登录验证 login 记录登录状态 logout 退出用户登录 is_authenticated 判断用户是否登录 login_required装饰器 进行登录判断 引入模块 from django.…

儿科常见疾病的中成药疗法

孩子感冒&#xff0c;分清寒热是关键——儿童风寒感冒和风热感冒的中成药内服外治法 儿童不养儿不知父母恩&#xff0c;每个人恐怕都只有自己做了父母&#xff0c;才能感受到父母的爱。婴幼儿正处于最初的发育期&#xff0c;抵抗力弱&#xff0c;有个感冒发烧的也是常有的事儿。…

物化视图

有个项目因为有比较多的查询汇总&#xff0c;考虑到速度&#xff0c;所以使用了物化视图。简单的把用到的给整理了下。先看简单创建语句&#xff1a;create materialized view mv_materialized_test refresh force on demand start with sysdate nextto_date(concat(to_char( s…

为什么直接ping知乎的ip不能访问知乎的网站,而百度就可以?

结论&#xff1a; 简单的说&#xff0c;就是baidu有钱。 正文&#xff1a; 大型网站依靠自身稀稀落落的服务器很难满足网页“秒开”的用户需求&#xff0c;会加入CDN加速的队伍。 当用户访问 http://www.zhihu.com 时&#xff0c;域名解析到距离用户最近的CDN服务器的公网IP&am…

皮肤病

小偏方治百病/《国医绝学健康馆》编委会编.—重庆&#xff1a;重庆出版社&#xff0c;2010.3&#xff08;国医绝学健康馆&#xff09; 湿疹 苦参汤熏洗治阴囊湿疹方 苦参、蛇麻子中药各50克&#xff0c;混合后&#xff0c;在晚上煎汤&#xff0c;可直接放在脸盆中煎。煎好后&am…

MySQL-ProxySQL中间件(一)| ProxySQL基本概念

目录 MySQL-ProxySQL中间件&#xff08;一&#xff09;| ProxySQL基本概念&#xff1a; https://www.cnblogs.com/SQLServer2012/p/10972593.htmlMySQL-ProxySQL中间件&#xff08;二&#xff09;| Admin Schemas介绍&#xff1a;https://www.cnblogs.com/SQLServer2012/p/109…

01 ftp上传简单示例服务端

import json import socket import structserver socket.socket() server.bind((127.0.0.1,8001)) server.listen() conn,addr server.accept()#首先接收文件的描述信息的长度 struct_data_len conn.recv(4) data_len struct.unpack(i,struct_data_len)[0]# 通过文件信息的…

标签td设置隐藏(hidden)

这样设置这个td就不会被其他的td给挤掉了! 还有一种方法就是把tr标签的solid设置为0px 这个方法把td标签的left,right,bottom,top的边框的solid全部设置为0px;转载于:https://www.cnblogs.com/tranquilityMan/p/10972811.html

Windows Server 2008 NFS

打开Windows Server 2008的Dos运行窗口&#xff08;不是powershell&#xff09;&#xff0c;然后键入&#xff1a; servermanagercmd.exe -install FS-NFS-Services 安装完毕之后&#xff0c;就要把NFS的存贮映射到Windows Server 2008上某个盘符以供使用&#xff0c;但为了…

金融反欺诈模型----项目实战--机器学习

机器学习&#xff1a;从源数据清洗到特征工程建立谈金融反欺诈模型训练 本文旨在通过一个完整的实战例子&#xff0c;演示从源数据清洗到特征工程建立&#xff0c;再到模型训练&#xff0c;以及模型验证和评估的一个机器学习的完整流程。由于初识机器学习&#xff0c;会比较多的…