安卓之Service详解(一)

来源:互联网 发布:caffe 源码 github 编辑:程序博客网 时间:2024/06/12 16:23

本篇主要讲述StartedService

1.使用方法

1>Service的生命周期



通过上图可以发现,Service的生命周期及具体方法比Activity少很多,Service的主要核心逻辑都是写在onStartCommand()方法中,

2>通过下面Demo我们来一起学习Service





上图可以看到我用startService方法开启了一个service,具体操作如下

首先,新建一个类继承Service,在这直接上源码

(源码主要涉及生命周期和数值传递)

public class MyService extends Service {    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        throw new UnsupportedOperationException("Not yet implemented");    }    //服务被创建    @Override    public void onCreate() {        super.onCreate();        Log.e("TAG", "My Service Create!");    }    //在这里面写方法的核心任务    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.e("TAG", "传递的数据 ====== "+intent.getStringExtra("msg"));        for (int i = 0; i < 50; i++) {            System.out.println("onStartCommand"+i);            if(i == 30) {                this.stopSelf();                break;            }        }        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        super.onDestroy();        Log.e("TAG", "My Service Destroys");    }}

下面是MainActivity.Java


public class MainActivity extends AppCompatActivity {        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void start(View view) {        Intent intent = new Intent(this,MyService.class);        intent.putExtra("msg","哈哈哈哈哈哈MyService");        startService(intent);        Toast.makeText(this, "Service已开启", Toast.LENGTH_SHORT).show();    }    public void stop(View view) {        Intent intent = new Intent(this,MyService.class);        stopService(intent);        Toast.makeText(this, "service已停止", Toast.LENGTH_SHORT).show();    }}
布局文件就两个按钮,就不多说了

通过运行上面的程序,我们来看一下Service的详细信息

这是LogCat的日志:

(1)可以发现先执行onCreate在执行onStartCommand方法,然后打印数值

(2)可以发现Sercice的当前运行线程是main主线程

E/TAG: My Service Create!E/TAG: 传递的数据 ====== 哈哈哈哈哈哈MyServiceI/System.out: onStartCommand0mainI/System.out: onStartCommand1mainI/System.out: onStartCommand2main
在service创建成功后,再点击按钮StartService会发现OnCreate方法不再执行
所以,得出以下结论

1.oncreate   服务只会有一个实例,如果没被停止,只会创建一次2.当执行一个已经启动的服务后,会调用onstartcommand()方法来执行业务3.默认情况下服务于主线程在同一个线程中执行,如果在service中执行耗时操作必须在子线程操作4.使用startservice()启动的服务在没关闭之前会一直在后台运行

另外,onStartCommand()方法返回一个Int类型的值

这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值

这个返回值一共有四种常量

START_NOT_STICKY

如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务

START_STICKY

如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。

START_REDELIVER_INTENT

如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。



【请看下篇】Service 之BoundService使用