1.Service是一个应用程序组件(component),与Activity,BroadcastReceiver在一个层次;
2.Service没有图形界面;
3.通常用来处理一些耗时较长的操作(下载,播放音乐..),如果用BroadcastReceiver处理超过10s的操作通常会报错;
4.可以使用Service更新ContentProvider,发送Intent以及启动系统的通知等等
&
1.Service不是一个单独的进程
2.Service不是一个单独的线程
所以service和整个程序是在同一个进程和线程中运行的。
进程拥有独立的内存空间以及一些资源,一个进程里面可以包含多个线程(至少一个),一个应用程序最少有一个进程。
对于多个线程,CPU采用时间片调度算法使得线程之间不停快速切换,使我们感觉程序好像在同时运行。
生命周期:
注:Android2.0以后的版本,onStart()已经被onStartCommand()代替了
Service与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。Service启动到销毁的过程只会经历如下3个阶段:
创建服务
开始服务
销毁服务
一个服务实际上是一个继承android.app.Service的类,当服务经历上面3个阶段后,会分别调用Service类中的3个事件方法进行交互,这3个事件方法如下:
- public void onCreate(); // 创建服务
- public void onStart(Intent intent, int startId); // 开始服务
- public void onDestroy(); // 销毁服务
一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。
例如,我在onCreate()写了一个toast:
Toast.makeText(context, "it's oncreate()", Toast.LENGTH_LONG).show();
用短信触发这个Service,在这个程序没有运行的时候,用短信触发之后,toast显示了“it's oncreate()”,
然而再次尝试用短信触发这个程序的时候,不再显示了,因为这个程序在后台运行了,service已经被启用。
当我们把这个程序kill掉之后,则可以重新通过短信触发oncreate里的toast。
而如果在onStartCommand()里面写一个toast:
Toast.makeText(context, "it's onStartCommand()", Toast.LENGTH_LONG).show();
那么每次用短信触发的时候就都会出现"it's onStartCommand()"的toast,不会出现只toast一次的情况。
注意这个toast要写在return语句的前面,不然报错,return后面好像是不能写字的。
LINKS:
BroadcastReceiver调用Service: