android service

来源:互联网 发布:2016年保险理赔数据 编辑:程序博客网 时间:2024/06/03 22:46

一、首先了解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后面好像是不能写字的。


二、然后区别一下service中的onStartCommand()和onCreate()方法的区别:

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。
从Android官方文档中,我们知道onStartCommand有4种返回值:

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。


START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

三、防止被kill掉的方法
1.在service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建
@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }----------------
  @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                // TODO Auto-generated method stub
                Log.v("TrafficService","startCommand");
                
                flags =  START_STICKY;
                return super.onStartCommand(intent, flags, startId);
//                return  START_REDELIVER_INTENT;
        }
2.在Service的onDestroy()中重启Service.
public void onDestroy() {   
        Intent localIntent = new Intent();
        localIntent.setClass(this, MyService.class);  //销毁时重新启动Service
        this.startService(localIntent);
    }


0 0
原创粉丝点击