安卓之Service详解(一)

本篇主要讲述StartedService

1.使用方法

1>Service的生命周期

安卓之Service详解(一)_第1张图片


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

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



安卓之Service详解(一)_第2张图片


上图可以看到我用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: 传递的数据 ====== 哈哈哈哈哈哈MyService
I/System.out: onStartCommand0main
I/System.out: onStartCommand1main
I/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使用



你可能感兴趣的:(Android)