Service

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个事件方法如下:

  1. public void onCreate(); // 创建服务
  2. public void onStart(Intent intent, int startId); // 开始服务
  3. 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:

http://www.cnblogs.com/larrylawrence/p/3421629.html

posted @ 2013-11-13 10:39  LarryLawrence  阅读(3259)  评论(0编辑  收藏  举报