1.服务不是单一的进程。服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中。

2.服务不是线程。可以在线程中工作。

一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。

同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。

二.如果任务占用CPU时间多,资源大的情况下,要使用线程。

servie是系统的组件,它由系统进程托管(servicemanager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。

1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用Thread 来执行一些异步的操作。

2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的Service 是运行在主进程的main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的main 线程上运行的。如果是Remote Service,那么对应的Service 则是运行在独立进程的main 线程上。

既然这样,那么我们为什么要用Service 呢?其实这跟android 的系统机制有关,我们先拿Thread 来说。Thread 的运行是独立于Activity 的,也就是说当一个Activity 被finish 之后,如果你没有主动停止Thread 或者Thread 里的run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当Activity 被finish 之后,你不再持有该Thread 的引用。另一方面,你没有办法在不同的Activity 中对同一Thread 进行控制。

举个例子:如果你的Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该Thread 需要在Activity 没有start的时候也在运行。这个时候当你start 一个Activity 就没有办法在该Activity 里面控制之前创建的Thread。因此你便需要创建并启动一个Service ,在Service 里面创建、运行并控制该Thread,这样便解决了该问题(因为任何Activity 都可以控制同一Service,而系统也只会创建一个对应Service 的实例)。

因此你可以把Service 想象成一种消息服务,而你可以在任何有Context 的地方调用Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在Service 里注册BroadcastReceiver,在其他地方通过发送broadcast 来控制它,当然这些都是Thread 做不到的。

---------------------------------------------------------------------------------

广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
}
}
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

如果你想别人接收到的短信,达到你不可告人的目的,那么使用BroadcastReceiver
当系统收到短信时,会发出一个广播Intent,Intent的action名称为、

如果要短信终止广播就要配置上你的广播接收者的级别

<intent-filter android:priority="100" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>

android.provider.Telephony.SMS_RECEIVED,该Intent存放了系统接收到的短信内容,我们使用名称“pdus”即可从Intent中获取到短信内容。

在AndroidManifest.xml文件中的<application>节点里对接收到短信的广播Intent进行订阅:
<receiver android:name=".你的receiver名称">
<intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->

广播接收者的响应性

在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法, onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)错误对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的所在进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。

public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
//发送Intent启动服务,由服务来完成比较耗时的操作
Intent service = new Intent(context, XxxService.class);
context.startService(service);
}

除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>

接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
并且要进行权限声明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

广播接收者补充

广播分两种 
有序广播 按照广播的优先级 发给相对应的广播接收者-1000-1000 激活广播通过onrecve方法处理
无序广播

有序广播有一个特例
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
resultReceiver 广播接受者 如果我们显示的指定了广播接收者 
无论如何 都会接受广播 无法通过abortBroadcast();的方法终止广播
比如拨打电话有个out_goingcall 的广播是指定广播接收者的无法通过abortBroadcast()方法终止的,但是是可以将拨打的电话号码数据清空置为null,setResultData(null)就无法拨打电话

另外一种特殊的广播sendStickyBroadcast(intent) // 阴魂不散的广播 
一般广播事件发送完毕被广播接受者接收到onReceive执行完毕后广播接收者的生命周期就结束了 这个会保持长时间的停留直到广播事件结束完毕
例如系统的Wifi,网卡状态的改变要一定的时间,保证网络状态更新完毕后才结束

代码中注册,如果代码没有执行,就接受不到广播事件

什么时候使用广播,例如sdcard新增图片的时候是无法显示到图库的当sdcard被挂载状态发生改变才会重新加载sdcard的数据

这时可以发送一个sd挂载的通知,通知系统的gallery去获取到新的图片.

Intent intent = newIntent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));

sendBroadcast(intent);

android-Service和Thread的区别相关推荐

  1. Android Service与Thread的区别

    Android Service,后台,Android的后台就是指,它的运行是完全不依赖UI的.即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行.比如说一些应用程序 ...

  2. Android复习10【Service与Thread的区别、Service的生命周期、Service生命周期解析(相关方法详解、启动方式的不同、绑定)、音乐播放器+服务】

    音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目   录 Service与Thread的区别 Service的生命周期 Service生命周 ...

  3. Service 与 Thread 的区别

    Service 与 Thread 的区别 很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来 ...

  4. 知识点干货--聊一聊Android中Service与Thread的区别

    古语说得好:"一寸光阴一寸金,寸金难买寸光阴."一寸光阴和一寸长的黄金一样昂贵,而一寸长的黄金却难以买到一寸光阴.比喻时间十分宝贵.此语句出自唐朝王贞白的<白鹿洞二首> ...

  5. service和thread的区别,何时用service,何时用thread?

    按服务性质分local service和remote service 当它运行的时候如果是Local Service,那么对应的 Service是运行在主进程的 main 线程上的.如:onCreat ...

  6. android Service中Thread.sleep不精确

    平台 RK3288 + Android 7.1 问题 在测试Thread.sleep过程中发现, 当App进入后台后, 服务中的Thread.sleep会有不同程度的精确度丢失. 测试sleep 2m ...

  7. Android Service 全解析

    Service的种类    按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Loca ...

  8. 既然android service是运行在主线程中的,那service还有什么用?

    既然android service是运行在主线程中的,那service还有什么用? 对于Android,每一个进程都有一个主线程,四大组件的处理任务都是在这个线程中进行的.每个线程都有一个Messag ...

  9. Android开发笔记之:Handler Runnable与Thread的区别详解

    From:http://www.jb51.net/article/37465.htm 本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友 ...

  10. Android 轮询最佳实践 Service + AlarmManager+Thread

    为什么80%的码农都做不了架构师?>>>    android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道 ...

最新文章

  1. 弄了个调试呼叫中心用的小机器
  2. UA MATH636 信息论1 熵
  3. 2018.2.28(延迟加载和缓存)
  4. canny算子的理论分析
  5. 服务器重启后发现docker-compose的nginx重启失败: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: addres
  6. matlab中ncread读取nc文件其中一个三维参数的其中一维_Matlab使用技巧总结-1
  7. 路灯灭了,路灯干扰者经过
  8. 01 Oracle 导入SQL文件
  9. java ios开发工具_5款用来开发iOS应用的Java开源工具
  10. 杭州,杭州……念兹在兹
  11. treemap倒叙_java对map进行排序(对日期倒叙)
  12. 中断上下文中的preempt count
  13. 计算机控制系统直流电机闭环调速实验,51系列单片机直流电机闭环调速实验1.pdf...
  14. Windows脚本:打开浏览器访问任意网址
  15. QT-3-基本组件2
  16. logging level级别
  17. 礼品卡配合U盘,美国一公司遭受BadUSB真实攻击
  18. 微信小程序如何返回到上一个页面,并刷新页面呢?
  19. PMI、国家外专局-项目管理高端论坛在深圳召开
  20. CTF 关于ZIP解题过程

热门文章

  1. 信号与系统:快速傅里叶变换FFT中的实际频率(奈奎斯特频率解析)
  2. springboot单例模式注入对象_springboot 请求流程简介
  3. Docker容器网络管理
  4. 一周一论文(翻译)——[PVLDB 17] Dhalion: 基于Heron自适应调整的流处理系统
  5. 轴自定义图标_9种吸引人的图标样式,能给你的设计带来良好的用户体验
  6. jrebel热部署不起作用_5种SpringBoot热部署方式,你用哪种?
  7. c语言宏定义_掌握C语言,中文编程不是梦
  8. ArcEngine的拓扑分析之ITopologicalOperator
  9. apply通过实例理解
  10. Android FrameWork学习(二)Android系统源码调试