Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。

那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService,IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。


Service的官方介绍

1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。

2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作


IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。

IntentService有以下特点:

(1)  它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2)  创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3)  不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4)  默认实现的onBind()返回null

(5)  默认实现的onStartCommand()的目的是将intent插入到工作队列中

继承IntentService的类至少要实现两个函数:构造函数和onHandleIntent()函数。要覆盖IntentService的其它函数时,注意要通过super调用父类的对应的函数


package com.loaderman.intentservicedemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding
//连续两次启动IntentService,会发现应用程序不会阻塞,而且最重要的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)
startService(new Intent(this,MyIntentService.class));
startService(new Intent(this,MyIntentService.class));
}
}
package com.loaderman.intentservicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder; /**
* Created by JCF on 2017/2/28.
*/ public class MyService extends Service { @Override
public void onCreate() {
super.onCreate();
} @Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作
System.out.println("onStart");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("睡眠结束");
} @Override
public IBinder onBind(Intent intent) {
return null;
}
}
package com.loaderman.intentservicedemo;

import android.app.IntentService;
import android.content.Intent; /**
* Created by JCF on 2017/2/28.
*/ public class MyIntentService extends IntentService { public MyIntentService() {
super("loaderman");
} @Override
protected void onHandleIntent(Intent intent) {
// 经测试,IntentService里面是可以进行耗时的操作的
//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent
//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
System.out.println("onStart");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("睡眠结束");
}
}

本文学习来源:http://blog.csdn.net/smile3670/article/details/7702521

       http://www.cnblogs.com/zhangs1986/p/3602154.html

       http://blog.csdn.net/matrix_xu/article/details/7974393


最新文章

  1. Spring(三)__aop编程
  2. 微信硬件H5面板开发(一) ---- 调用openApi
  3. Android_SQLite版本升级,降级 管理
  4. codevs 1163 访问艺术馆
  5. 浏览器默认样式(User Agent Stylesheet)
  6. SQL(Oracle)
  7. css3 过渡记
  8. 刷新dns
  9. Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
  10. 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
  11. loadrunner时间损耗-analysis中忽略
  12. RFM模型+SOM聚类︱离群值筛选问题
  13. 解决微信小程序Video 某些属性设置不起作用问题
  14. 【托业】【跨栏】TEST04
  15. WPF实现特殊统计图
  16. Maven 快速入门
  17. 每日英语:Teens Are Still Developing Empathy Skills
  18. 论文笔记之:End-to-End Localization and Ranking for Relative Attributes
  19. js 过滤字符 和检测 特殊字符
  20. #Leetcode# 700. Search in a Binary Search Tree

热门文章

  1. nohup命令(Linux终端启动后台运行程序)
  2. 【2017-04-10】js来控制导航栏在滚动条拉到一定位置时显示
  3. ubuntu16.04下NVIDIA GTX965M显卡驱动PPA安装
  4. Linux使用wget仿站
  5. css全部理解
  6. x86和x64下指针的大小
  7. 下载Mybatis源码
  8. 如何判断元素是否在可视区域ViewPort
  9. tomcat不能处理图形
  10. 白话Spring(基础篇)---AOP(execution表达式)(转)